inet_ntoa 使用注意事项

这是一个在解析IP协议的一个场景下的遇到的问题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
char *ip_src_str = inet_ntoa(ip->ip_src);
char *ip_dst_str = inet_ntoa(ip->ip_dst);
snprintf(ip_port, sizeof(ip_port), ""remote_addr":"%s","target_addr":"%s",", ip_src_str,
ip_dst_str);

/*inet_ntoa返回一个char *,而这个char *的空间是在inet_ntoa里面静态分配的,所以inet_ntoa后面的调用会覆盖上一次的调用。
所以两次取值是取到最后一次的值。解决方案,将每次取到的值进行赋值备份。
*/

char ip_src_str[16];
snprintf(ip_src_str, sizeof(ip_src_str), "%s", inet_ntoa(ip->ip_src));
char ip_dst_str[16];
snprintf(ip_dst_str, sizeof(ip_dst_str), "%s", inet_ntoa(ip->ip_dst));
snprintf(ip_port, sizeof(ip_port), ""remote_addr":"%s","target_addr":"%s",", ip_src_str,
ip_dst_str);