我有一个用户空间程序,我在其中处理数据包。我在iptables的帮助下发送给他们。
但是我有一个问题是要正确获取数据包的源和目标。目的地应为 192.168.1.66 ,来源 192.168.0.102 。但奇怪的是,如果我写:
char *dstIpAddress = inet_ntoa(((struct ip*)full_packet)->ip_dst);
char *srcIpAddress = inet_ntoa(((struct ip*)full_packet)->ip_src);
我同时获得目的地和来源 192.168.1.66 但如果我写:
char *srcIpAddress = inet_ntoa(((struct ip*)full_packet)->ip_src);
char *dstIpAddress = inet_ntoa(((struct ip*)full_packet)->ip_dst);
我同时获得了目标和来源 192.168.0.102 。
问题出在哪里?
答案 0 :(得分:0)
正如Obvlious船长评论的那样,inet_ntoa
返回一个静态分配的缓冲区。来自inet_ntoa(3):
inet_ntoa()函数将以网络字节顺序给出的Internet主机地址转换为IPv4点分十进制表示法中的字符串。该字符串在静态分配的缓冲区中返回,后续调用将覆盖该缓冲区。
复制返回的值或使用inet_ntop
,它使用用户分配的缓冲区。