C语言UDP广播程序发送数据包实际端口与指定端口不符问题求助
问题解答
端口与预期不符的根因
你的问题是缺失网络字节序转换导致的:
- TCP/IP协议栈要求传输层端口、网络层IP都必须使用大端格式(网络字节序),而你的代码直接将主机字节序的
port变量赋值给sockaddr_in结构体的sin_port字段,没有做字节序转换。 - 可以直接验证你的观测结果:Debian运行在小端架构上,10000的十六进制为
0x2710,小端存储高低位翻转后为0x1027,转十进制就是你抓到的4135;15000的十六进制为0x3A98,翻转后为0x983A,转十进制就是38970,完全匹配你Wireshark的观测结果。 - 修复方法:给端口赋值时调用
htons()(主机字节序转网络字节序短整型),将broadcastAddr.sin_port = port;修改为broadcastAddr.sin_port = htons(port);即可。
接收端乱码的根因
你监听错误端口收到的乱码,本质是这些端口上原本就有其他程序发送的网络报文,你碰巧监听到了不属于自己的报文,内容自然和你预期的Hello World不匹配,显示为乱码。修复端口问题后,在你指定的10000/15000端口监听就能收到正常的字符串内容。
修复后的核心代码片段
// 构造广播地址结构体 broadcastAddr.sin_family = AF_INET; broadcastAddr.sin_port = htons(port); // 新增字节序转换 broadcastAddr.sin_addr.s_addr = inet_addr(BC_ADDR);
附加提示:
inet_addr属于已废弃接口,后续可以改用inet_pton做IP地址转换,兼容性更好。
内容的提问来源于stack exchange,提问作者11011100
相关产品推荐
相关产品推荐

