免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3204 | 回复: 7
打印 上一主题 下一主题

问一个关于inet_ntoa的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-01-29 14:02 |只看该作者 |倒序浏览
我在一个爪包程序中打印初包的ip

cout<<inet_ntoa(MyPacket.iph->ip_src)<<"   "<<inet_ntoa(MyPacket.iph->ip_dst)<<endl;

结果所有的包打出来的   源ip==目的ip

但是
cout<<"src:"<<inet_ntoa(MyPacket.iph->ip_src);
cout<<"     dst:"<<inet_ntoa(MyPacket.iph->ip_dst)<<endl;

分开两行后,打印出来的ip就正常了。为什么呢?

论坛徽章:
0
2 [报告]
发表于 2007-01-29 14:39 |只看该作者
据说是因为inet_ntoa()里面用了一个静态结构的原因,但我不是很清楚。希望各位大大详细说说

论坛徽章:
0
3 [报告]
发表于 2007-01-29 14:42 |只看该作者
inet_ntoa 使用 static 数组来存放输出的 ip 串。若连续两次调用这个函数,后一次的会覆盖前一次的。

<< inet_ntoa << inet_ntoa << endl

先把 inet_ntoa 执行了两次,然后才输出,所以 ip 变成相同的了。

这个类似于 printf ("%s %s\n", inet_ntoa(), inet_ntoa())。

[ 本帖最后由 win_hate 于 2007-1-29 15:13 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2007-01-29 14:57 |只看该作者
不是后一次的覆盖前一次的吗?

论坛徽章:
0
5 [报告]
发表于 2007-01-29 14:59 |只看该作者
cout<<"src:"<<inet_ntoa(MyPacket.iph->ip_src);
cout<<"     dst:"<<inet_ntoa(MyPacket.iph->ip_dst)<<endl;
这样子就不是连续执行了吗?

论坛徽章:
0
6 [报告]
发表于 2007-01-29 15:11 |只看该作者
原帖由 xiechunlu 于 2007-1-29 14:59 发表
cout<<"src:"<<inet_ntoa(MyPacket.iph->ip_src);
cout<<"     dst:"<<inet_ntoa(MyPacket.iph->ip_dst)<<endl;
这样子就不是连续执行了吗?

三楼老版主已经解释得很清楚了,可能你没理解,是这样的:
这里涉及到一个计算次序的问题
> cout<<inet_ntoa(MyPacket.iph->ip_src)<<"   "<<inet_ntoa(MyPacket.iph->ip_dst)<<endl;
这里你的编译器是先计算inet_ntoa(MyPacket.iph->ip_src)和inet_ntoa(MyPacket.iph->ip_dst),也就是第二次调用的结果把第一次的覆盖了,在这两次函数调用之后,才对函数返回结果进行输出,所以出现了你的结果

对于分开写,就不涉及到计算次序的问题了,所以结果正常

另外,在标准中,这里的计算次序是未定义的,不同编译器会有不同的结果,所以应该避免这样写程序。分开写就是一个不错的选择

论坛徽章:
0
7 [报告]
发表于 2007-01-29 15:33 |只看该作者
强!谢了

论坛徽章:
0
8 [报告]
发表于 2007-01-29 18:14 |只看该作者
以后永远不要再使用inet_ntoa!
改用:
man inet_pton
man inet_ntop
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP