libpcap测试中输出IP地址的问题?
代码来源:[url]http://www.cet.nau.edu/~mc8/Socket/Tutorials/section4.html[/url]
ip = (struct my_ip*)(packet + sizeof(struct ether_header)); //取得IP头部数据
主要输出语句:
fprintf(stdout,"%d %d %d %s ",version,hlen,proto,inet_ntoa(iphdr->ip_src));
fprintf(stdout," %s \n",inet_ntoa(iphdr->ip_dst));
fprintf(stdout,"%d %d %d %s %s\n",version,hlen,proto,inet_ntoa(iphdr->ip_src),inet_ntoa(iphdr->ip_dst));
前两句是网页上的,后一句是我把前两句写成了一句,按道理这样不应该有什么问题,可输出结果却???
输出:
[root@yqlyd root]# gcc mypcap20070524.c -o mypcap.o -lpcap
[root@yqlyd root]# ./mypcap.o >test.txt
4 5 6 172.16.10.170 134.114.64.3 //这里是正常的两个IP的输出
4 5 6 172.16.10.170 172.16.10.170 //这里的两个IP地址都是源IP 下面也是一样的???
4 5 6 134.114.64.3 172.16.10.170
4 5 6 134.114.64.3 134.114.64.3
4 5 6 172.16.10.170 134.114.64.3
4 5 6 172.16.10.170 172.16.10.170
4 5 6 172.16.10.170 134.114.64.3
4 5 6 172.16.10.170 172.16.10.170
弄了好久一直找不出原因在哪???? 请仁兄帮忙!!!! > 按道理这样不应该有什么问题
你想当然的吧。inet_ntoa()用了静态缓冲区,在man手册里都会提醒你这个问题的。你这样写只会导致最后一次调用覆盖以前的调用结果。这个函数属于废弃的函数,一定要用,就自己封装,分配动态缓冲区,复制结果。 没有理解你所说的"想当然的吧"的意思?是说上面的输出吗?如果是的话,那些输出就是我运行时候的输出结果(我保证,千真万确)!!
如果你说的inet_ntoa()不用了
那还得请问仁兄:
我怎么把"iphdr->ip_src"转换成我们通常看到的IP形式:172.16.10.170
"iphdr->ip_src"好象是一个uint32_t (应该就是4个字节的int吧!)的数据类型
[[i] 本帖最后由 lyd 于 2007-6-4 12:43 编辑 [/i]] the problem is solved! use "inet_ntop" over! [quote]原帖由 [i]lyd[/i] 于 2007-6-4 12:41 发表 [url=http://www.netexpert.cn/redirect.php?goto=findpost&pid=96844&ptid=15845][img]http://www.netexpert.cn/images/common/back.gif[/img][/url]
没有理解你所说的"想当然的吧"的意思?是说上面的输出吗?如果是的话,那些输出就是我运行时候的输出结果(我保证,千真万确)!!
如果你说的inet_ntoa()不用了
那还得请问仁兄:
我怎么把"iphdr->ip_src"转换成我们 ... [/quote]
我说你想当然认为"按道理这样不应该有什么问题",事实是"按道理这样就该出这样的问题"。
inet_ntop()能解决你的问题固然是一种选择。但可移植性不好。
你就不能自己输出IP?用格式串%u.%u.%u.%u自己输出,不是很难理解吧。 先谢谢SCZ的指导!
可能是我的基础还有些差,所以有很多东西考虑不周,当然用你说的“%u”输出是可以。
我这里把获取到IP后,还要把它存起来,与以后的IP包去匹配,如果还有相同的IP(SIP,DIP),则把它们放到一起。 :victory:
页:
[1]