IPv6客户端socket绑定指定端口异常 实际绑定端口与预期不符
问题根因
- 代码未将传入的端口号从主机字节序转换为网络字节序,直接赋值给了
sockaddr_in6结构的sin6_port字段,导致实际绑定的端口和预期不一致。 - 网络协议栈要求端口、IP地址这类字段必须使用大端格式(网络字节序),而常用的x86/ARM等平台主机字节序多为小端格式,直接赋值会出现字节序反转的问题,你遇到的数值刚好对应了反转后的结果:你传入的54682是小端主机字节序,内核按大端读取后实际值就是39637,和你运行输出完全吻合。
修复方法
修改代码中端口赋值的一行,添加htons函数做字节序转换:
// 原错误代码 addr.sin6_port = atoi(argv[1]); // 修改为 addr.sin6_port = htons(atoi(argv[1]));
htons是专门用于将16位整数(端口号刚好是16位)从主机字节序转换为网络字节序的系统函数,修改后重新编译运行即可实现绑定指定端口的效果。
内容的提问来源于stack exchange,提问作者suresh
相关产品推荐
相关产品推荐

