POSIX网络协议栈
这些都是
服务器端流程
创建socket:选择UDP或TCP协议,返回一个整型句柄
1
2
3int sockfd = socket(AF_INET, SOCK_STREAM, 0); // TCP
// 或
int sockfd = socket(AF_INET, SOCK_DGRAM, 0); // UDP绑定socket:将socket绑定到特定IP地址和端口
1
2
3
4
5
6
7struct sockaddr_in server_addr;
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = htonl(INADDR_ANY); // 任意IP
server_addr.sin_port = htons(PORT);
bind(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr));监听socket:监听绑定的端口(仅TCP需要)
1
listen(sockfd, BACKLOG); // BACKLOG为等待连接队列的最大长度
接受连接:接受客户端连接请求(仅TCP需要)
1
2
3struct sockaddr_in client_addr;
socklen_t client_len = sizeof(client_addr);
int client_sockfd = accept(sockfd, (struct sockaddr*)&client_addr, &client_len);发送数据:
1
2
3
4
5
6// TCP
send(client_sockfd, buffer, strlen(buffer), 0);
// UDP
sendto(sockfd, buffer, strlen(buffer), 0,
(struct sockaddr*)&client_addr, sizeof(client_addr));接收数据:
1
2
3
4
5
6// TCP
recv(client_sockfd, buffer, BUFFER_SIZE, 0);
// UDP
recvfrom(sockfd, buffer, BUFFER_SIZE, 0,
(struct sockaddr*)&client_addr, &client_len);关闭连接:
1
2close(client_sockfd); // 关闭客户端连接
close(sockfd); // 关闭服务器socket
客户端流程
创建socket:与服务器端相同
1
int sockfd = socket(AF_INET, SOCK_STREAM, 0); // TCP
发起连接:连接到服务器(仅TCP需要)
1
2
3
4
5
6
7struct sockaddr_in server_addr;
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); // 服务器IP
server_addr.sin_port = htons(PORT);
connect(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr));发送/接收数据:与服务器端相同
关闭连接:
1
close(sockfd);
```
评论