TCP回显服务器打印的客户端端口与netstat查询结果不一致问题
问题原因
你输出客户端端口时未将struct sockaddr_in中存储的网络字节序端口转换为主机字节序,导致打印值和实际端口不符。
具体原理
- TCP/IP协议栈在传输层、网络层使用统一的大端序(即网络字节序)存储端口、IP地址等数值,
client.sin_port字段存储的就是网络字节序的端口值 - x86等主流CPU默认使用小端序作为主机字节序,你直接将网络字节序的
sin_port用%d格式打印,相当于把大端序整数直接按小端序规则解析,结果自然是错误的 - 你给出的两个端口刚好可以验证这个问题:你程序打印的34997转十六进制为
0x88B5,大小端字节颠倒后得到0xB588,转十进制就是46472,正好是netstat查询到的实际客户端端口。
修复方案
修改两处端口打印代码,用ntohs()(network to host short)将网络字节序端口转为主机字节序后再打印即可:
// 连接时的打印 printf("client connected: %s:%d\n", inet_ntoa(client.sin_addr), ntohs(client.sin_port)); // 断开时的打印 printf("client disconnected: %s:%d\n", inet_ntoa(client.sin_addr), ntohs(client.sin_port));
内容的提问来源于stack exchange,提问作者mojo
相关产品推荐
相关产品推荐

