You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 17:54:04