单机本地套接字通信
C语言编程注意事项
-
在window系统下较linux系统需要多一步初始化网络环境的操作`
WSADATA wsaData; if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) { printf("初始化Winsock失败\n"); return -1; } printf("初始化Winsock成功\n");`
-
头文件应包含
#include <winsock.h>
,为方便代码的移植,省去对项目属性的更改依赖,可以使用预编译命令实现在代码中指定对特定库的链接#pragma comment(lib,"ws2_32.lib")
服务端程序
-
创建socket`
int sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd == -1) { perror("Socket creation failed"); return 1; }`
-
配置socket`
struct sockaddr_in server_addr; memset(&server_addr, 0, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_port = htons(PORT); server_addr.sin_addr.s_addr = INADDR_ANY; if (bind(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr)) == -1) { perror("Bind failed"); return 1; }`
-
开启监听`
if (listen(sockfd, 5) == -1) { perror("Listen failed"); return 1; } printf("Server listening on port %d\n", PORT);`
-
进入等待连接的循环
while (1) { // 接受连接 int client_len = sizeof(struct sockaddr_in); int client_fd = accept(sockfd, (struct sockaddr*)&server_addr, &client_len); if (client_fd == -1) { perror("Accept failed"); continue; } //// 与客户端通信的循环 while (1) { /*在这里键入链接成功后将要持续执行的代码*/ } // 关闭连接 closesocket(client_fd); }
-
连接成功后开始通信
while (1) { char szData[BUFFER_SIZE]; int ret = recv(client_fd, szData, sizeof(szData) - 1, 0); if (ret > 0) { szData[ret] = '\0'; // 添加字符串结束符 printf("5. 接收客户端数据成功[%s]\n", szData); // 发送回显数据 ret = send(client_fd, szData, ret, 0); if (ret == SOCKET_ERROR) { printf("发送数据失败\n"); break; // 发送失败,断开与该客户端的连接 } } else if (ret == 0) // 客户端关闭连接 { printf("客户端已主动断开连接。\n"); break; // 正常退出循环,准备处理下一个客户端 } else // 发生错误 { printf("接收客户端数据失败\n"); break; // 错误处理后断开连接 } }