为什么我的TCP socket发送消息后netcat监听端收不到任何数据?
问题原因分析
- 协议类型不匹配
你代码中调用socket(AF_INET, SOCK_STREAM, 0)创建的是TCP协议的流套接字,但你执行的netcat -u -l 9100命令中-u参数指定的是监听UDP协议端口,两个程序使用的传输层协议完全不一致,自然无法收到数据。 - 目标地址配置错误
你把目标服务端的IP、端口正确填写到了demoserverAddr结构体中,但调用sendto时传入的目标地址却是被全量置0的cliaddr结构体,相当于你要发送的目标IP是0.0.0.0、目标端口是0,根本没有指向你要发的127.0.0.1:9100地址。 - TCP套接字未建立连接就调用sendto
TCP是面向连接的传输协议,使用TCP套接字发送数据前必须先调用connect()和目标端完成三次握手建立连接,直接用未连接的TCP套接字调用sendto是无法成功发送数据的,该调用会直接报错返回,你可以打印sendto的返回值确认错误信息。
修复方案
两种可选方案,按需选择:
方案1:改为UDP通信匹配netcat的监听配置
修改套接字创建代码为UDP类型,同时修正目标地址参数:
// 1. 创建UDP套接字 fd = socket(AF_INET, SOCK_DGRAM, 0); // 2. sendto时传入正确的目标地址demoserverAddr,而不是cliaddr sendto(fd, temp_buff, strlen(temp_buff), MSG_CONFIRM, (const struct sockaddr *)&demoserverAddr, sizeof(demoserverAddr));
修改后保持现有netcat -u -l 9100命令不变即可收到数据。
方案2:改为完整TCP通信逻辑
去掉netcat的-u参数,监听TCP端口,同时补全TCP连接逻辑:
- 终端执行的监听命令改为
netcat -l 9100 - 代码中创建完TCP套接字、填写完
demoserverAddr后,先调用connect建立连接再发送数据:
if(connect(fd, (struct sockaddr *)&demoserverAddr, sizeof(demoserverAddr)) <0) { // 连接失败处理逻辑 } // 直接用send发送即可,不需要用sendto指定地址 send(fd, temp_buff, strlen(temp_buff), 0);
内容的提问来源于stack exchange,提问作者Report Feedback
相关产品推荐
相关产品推荐

