这段C语言IP处理代码输出异常,求排查问题原因
IP地址转换输出异常问题排查
问题根源
代码调用inet_ntop时传入的第二个参数错误:你传递了整个struct sockaddr_in结构体的指针&servaddr,但该函数处理AF_INET类型时,需要的是struct in_addr类型的指针(即servaddr.sin_addr的地址)。
错误解析
struct sockaddr_in的内存布局中,前两个字段是sin_family(值为AF_INET即2)和sin_port(值为htons(22000)即0x55f0)。当把整个结构体指针传给inet_ntop时,函数会从起始位置读取4字节当作IP地址数据:
- 第一个字节是
sin_family的低字节:0x02→ 十进制2 - 第二个字节是
sin_family的高字节:0x00→ 十进制0 - 第三个字节是
sin_port的低字节:0x55→ 十进制85 - 第四个字节是
sin_port的高字节:0xf0→ 十进制240
这四个字节组合起来就是错误输出的2.0.85.240。
修正后的代码
int main(int argc, char **argv) { struct sockaddr_in servaddr; char buf[INET_ADDRSTRLEN]; memset(&servaddr, 0, sizeof(servaddr)); servaddr.sin_addr.s_addr = inet_addr("127.0.0.1"); servaddr.sin_port = htons(22000); servaddr.sin_family = AF_INET; fprintf(stderr, "addrinfo: %s\n", inet_ntop(AF_INET, &servaddr.sin_addr, buf, INET_ADDRSTRLEN)); }
内容的提问来源于stack exchange,提问作者Richard Melville
相关产品推荐
相关产品推荐

