使用inet_ntop替换inet_ntoa进行网络地址到字符地址转换

来源:互联网 发布:vr软件看不了 编辑:程序博客网 时间:2024/05/29 19:25

问题背景:

我在提取网络层数据时需要进行IP地址到点十分地址的时候使用inet_ntoa函数进行输出转换,但是我在同一个输出里面调用inet_ntoa分别对源IP和目的IP进行转换时输出的结果是一样的。我保证了我的源IP和目的IP是不同的,结果却让我很诧异

 printf("%s,%s",inet_ntoa(addr[0]),inet_ntoa(addr[1])); //输出结果 192.168.17.2, 192.168.17.2
后来查找资料发现,inet_ntoa的结果是保存在静态内存当中的,上面的输出代码返回的是同一个栈的数据,后面一个inet_ntoa会将前一个的数据进行覆盖导致数据错误。

解决方案:

1.将inet_ntoa的数据复制出来保存使用

2.使用inet_ntop函数指定参数进行转换

#include <sys/types.h>#include <sys/socket.h>#include <arpa/inet.h>const char *inet_ntop(int af, const void *src, char *dst, socklen_t cnt);
样例(来源百度百科):

#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <sys/socket.h>#include <netinet/in.h>int main (void){char IPdotdec[20]; //存放点分十进制IP地址struct in_addr s; // IPv4地址结构体// 输入IP地址printf("Please input IP address: ");scanf("%s", IPdotdec);// 转换inet_pton(AF_INET, IPdotdec, (void *)&s);printf("inet_pton: 0x%x\n", s.s_addr); // 反转换inet_ntop(AF_INET, (void *)&s, IPdotdec, 16);printf("inet_ntop: %s\n", IPdotdec);}

阅读全文
0 0
原创粉丝点击