网络分析专家论坛 netexpert's Archiver

lyd 发表于 2007-6-4 09:37

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

弄了好久一直找不出原因在哪????     请仁兄帮忙!!!!

scz 发表于 2007-6-4 11:38

> 按道理这样不应该有什么问题

你想当然的吧。inet_ntoa()用了静态缓冲区,在man手册里都会提醒你这个问题的。你这样写只会导致最后一次调用覆盖以前的调用结果。这个函数属于废弃的函数,一定要用,就自己封装,分配动态缓冲区,复制结果。

lyd 发表于 2007-6-4 12:41

没有理解你所说的"想当然的吧"的意思?是说上面的输出吗?如果是的话,那些输出就是我运行时候的输出结果(我保证,千真万确)!!
如果你说的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]]

lyd 发表于 2007-6-4 15:27

the problem is solved!   use "inet_ntop"    over!

scz 发表于 2007-6-5 08:47

[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自己输出,不是很难理解吧。

lyd 发表于 2007-6-5 14:37

先谢谢SCZ的指导!
可能是我的基础还有些差,所以有很多东西考虑不周,当然用你说的“%u”输出是可以。
我这里把获取到IP后,还要把它存起来,与以后的IP包去匹配,如果还有相同的IP(SIP,DIP),则把它们放到一起。

whq9908 发表于 2008-5-9 11:18

:victory:

页: [1]

Powered by Discuz! Archiver 6.1.0  © 2001-2007 Comsenz Inc.