Linux C TCP套接字编程 客户端发往服务端的消息异常打印在客户端
问题原因分析
- 错误1:服务端读数据用错文件描述符
TCP服务端accept()成功后返回的是专门用于和当前客户端通信的套接字,你代码中读取数据时用了监听用的server_socket,根本无法读取到客户端发来的消息,应该替换为accept()返回的socket_client。 - 错误2:客户端发数据用错文件描述符
connect()函数返回值是状态码:成功返回0,失败返回-1,不是通信套接字。你将connect返回值赋值后调用write(),相当于往标准输入文件描述符0写数据,而Linux下标准输入、输出、错误默认都绑定当前终端,所以数据直接打印到了客户端本地终端,根本没有发送到网络。正确应该用创建的客户端套接字socket_client发送数据。 - 次要问题:
accept()的第三个长度参数需要初始化为地址结构体大小,你现在赋值为0会导致无法正确获取客户端地址信息。
修正后的核心代码片段
server.c 读取部分修改
// 原错误代码:int res = read(socket_server, msg, sizeof(msg)); // 修改为: socklen_t len = sizeof(addr_client); // 修正len的初始化 int socket_client = accept(socket_server, (sockaddr *)&addr_client, &len); if (socket_client == -1) { perror("accept ERROR"); } char msg[100] = {0}; // 初始化数组避免打印乱码 int res = read(socket_client, msg, sizeof(msg)-1); // 用客户端通信套接字读 if(res > 0) { printf("MESSAGE FROM CLIENT: %s\n", msg); }
client.c 发送部分修改
// 原错误代码: // int socket_server = connect(socket_client, (sockaddr *)&addr_server, sizeof(addr_server)); // int res = write(socket_server, msg, sizeof(msg)); // 修改为: int ret = connect(socket_client, (sockaddr *)&addr_server, sizeof(addr_server)); if (ret == -1) { perror("connect ERROR"); } char msg[] = "HELLO WORLD!!!!!"; int res = write(socket_client, msg, sizeof(msg)); // 用客户端套接字发送
修改后重新编译运行即可看到服务端正常打印客户端发来的消息。
内容的提问来源于stack exchange,提问作者YCH
相关产品推荐
相关产品推荐

