主页 > 人工智能  > 

基于Linux内核的socket编程(TCP)的C语言示例


原文地址:https://www.geeksforgeeks.org/socket-programming-cc/

服务端:

#include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <unistd.h> #define PORT 8080 int main(int argc, char const* argv[]) { int server_fd, new_socket; ssize_t valread; struct sockaddr_in address; int opt = 1; socklen_t addrlen = sizeof(address); char buffer[1024] = { 0 }; const char* hello = "Hello from server"; // AF_INET表示IPV4网络通信领域。SOCKET_STREAM表示TCP,即流式。0表示默认(也可以填6表示TCP) if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { perror("socket failed"); exit(EXIT_FAILURE); } // SOL_SOCKET表示套接字级别的选项。SO_REUSEADDR表示服务关闭后,地址和端口可重入。这段可删 if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt))) { perror("setsockopt"); exit(EXIT_FAILURE); } address.sin_family = AF_INET; //设置协议簇为IPV4 address.sin_addr.s_addr = INADDR_ANY; //设置服务端接收的套接字的IP地址,INADDR_ANY表示任何本地地址 address.sin_port = htons(PORT);//设置端口号为8080 // Forcefully attaching socket to the port 8080 // 强制绑定,意思是不管之前是否有其他进程在使用8080端口 if (bind(server_fd, (struct sockaddr*)&address, sizeof(address)) < 0) { perror("bind failed"); exit(EXIT_FAILURE); } //最多允许3个请求处于半连接状态真正连接成功的会走到accept()函数 if (listen(server_fd, 3) < 0) { perror("listen"); exit(EXIT_FAILURE); } printf("waiting for connecting...\n"); if ((new_socket = accept(server_fd, (struct sockaddr*)&address, &addrlen)) < 0) { perror("accept"); exit(EXIT_FAILURE); } //从new_socket中读取数据,存入buffer中,长度-1是为了存放字符串的结束符 valread = read(new_socket, buffer,1024 - 1); printf("%s\n", buffer); send(new_socket, hello, strlen(hello), 0); printf("Hello message sent\n"); // closing the connected socket close(new_socket); // closing the listening socket close(server_fd); return 0; }

客户端:

// 需要先运行服务端 #include <arpa/inet.h> #include <stdio.h> #include <string.h> #include <sys/socket.h> #include <unistd.h> #define PORT 8080 int main(int argc, char const* argv[]) { int status, valread, client_fd; struct sockaddr_in serv_addr; const char* hello = "Hello from client"; char buffer[1024] = { 0 }; if ((client_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { perror("\n Socket creation error \n"); return -1; } serv_addr.sin_family = AF_INET; serv_addr.sin_port = htons(PORT); // 将地址转换成二进制 if (inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr) <= 0) { perror("Invalid address"); return -1; } //TCP使用connect()函数建立连接,之后就可以send()和read()了。而UDP无需建立连接,直接使用sendto()和recvfrom()函数 if ((status = connect(client_fd, (struct sockaddr*)&serv_addr, sizeof(serv_addr))) < 0) { perror("Connection Failed"); printf("You should run server side firstly\n"); return -1; } send(client_fd, hello, strlen(hello), 0); printf("Hello message sent\n"); //从client_fd中读取数据,存入buffer中,长度-1是为了存放字符串的结束符 valread = read(client_fd, buffer, 1024 - 1); printf("%s\n", buffer); // closing the connected socket close(client_fd); return 0; }

结果如下图:

标签:

基于Linux内核的socket编程(TCP)的C语言示例由讯客互联人工智能栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“基于Linux内核的socket编程(TCP)的C语言示例