tcp 服务器的设计思路
创建套接字
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
AF_INET
:IPv4 协议SOCK_STREAM
:TCP 流式套接字0
:默认协议
绑定 IP 和端口
struct sockaddr_in serv_addr; memset(&serv_addr, 0, sizeof(serv_addr)); serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = INADDR_ANY; // 任意网卡 serv_addr.sin_port = htons(8080); // 端口号 bind(sockfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr));
监听连接
listen(sockfd, 5); // 最大等待队列长度为5
接受连接
struct sockaddr_in cli_addr; socklen_t len = sizeof(cli_addr); int connfd = accept(sockfd, (struct sockaddr*)&cli_addr, &len);
- 返回一个新的套接字
connfd
用于与客户端通信 - 原套接字
sockfd
继续用于接受其他连接
- 返回一个新的套接字
数据交互
char buffer[1024]; recv(connfd, buffer, sizeof(buffer), 0); // 接收数据 send(connfd, buffer, strlen(buffer), 0); // 发送数据
关闭连接
close(connfd);