场景
调试中打印服务端和客户端的ip地址,代码如下,最终都是一个值。
printf("Received TCP packet from %s to %s \n", inet_ntoa(iphdr->ip_src), inet_ntoa(iphdr->ip_dst));
原因
因为inet_ntoa()
函数返回一个静态分配的缓冲区,多次调用,会覆盖上一次的结果。
/* Convert Internet number in IN to ASCII representation. The return value
is a pointer to an internal array containing the string. */
extern char *inet_ntoa (struct in_addr __in) __THROW;
解决
分两次打印。
printf("Received TCP packet from %s ", inet_ntoa(iphdr->ip_src));
printf("to %s len %d \n", inet_ntoa(iphdr->ip_dst), iphdr->ip_len);
或者使用inet_ntop()
char ip_str[INET_ADDRSTRLEN]; // 分配足够大小的缓冲区来存储转换后的字符串
const char *result = inet_ntop(AF_INET, &addr, ip_str, sizeof(ip_str));