原始套接字recvfrom的问题

时间:2021-01-01 10:58:54
我使用原始套接字开发了一个traceroute程序,在接收ICMP数据报的时候,recvfrom会接收到的ICMP报文中不仅有我想要的ICMP响应报文,还有其他的ICMP报文。

比如, 我用windows的 tracert 命令测量路由的同时,我运行我自己写的traceroute程序,在我的程序中也会收到对应于windows tracert命令的ICMP响应报文。此外,我在不同的线程中调用我的traceroute程序,使之并行的运行,各个traceroute程序之间也会相互影响,收到的报文中有对应于其他的traceroute的ICMP响应报文。

我怀疑原始套接字的 recvfrom 操作可能会接收任何ICMP报文,我的问题是,是否可以设置一下,使之只接收对应于自己这个raw socket发送的ICMP响应报文呢?

8 个解决方案

#1



帮顶

这个C++版块貌似MFC和VC的高手不是很多
可以将帖子转移到那个版块

#2


没人回答啊? 自己顶一下,各位大侠帮帮忙~~

#3


首先声明我也不太懂,请参考。
1、主机遇到的第一个路由应该是相同的,这是网络环境决定的。
2、你测试的是相同的地址吗?如果相同那结果应该也差不多。

#4


试试不设混杂模式的情况下看看

#5


原始套接字方式是在IP层对SOCKET进行编程,所以需要你在接收后对结构进行分析和过滤。

#6


该回复于2010-02-23 16:37:03被版主删除

#7


原始套接字的收发可能是有你这个限制,
如果用系统socket可能没有这个问题吧?
SOCKET sock = socket(AF_INET, PROTOCAL_IP, 0);

#8


结贴通知:
请lz注意结贴。。。。

#1



帮顶

这个C++版块貌似MFC和VC的高手不是很多
可以将帖子转移到那个版块

#2


没人回答啊? 自己顶一下,各位大侠帮帮忙~~

#3


首先声明我也不太懂,请参考。
1、主机遇到的第一个路由应该是相同的,这是网络环境决定的。
2、你测试的是相同的地址吗?如果相同那结果应该也差不多。

#4


试试不设混杂模式的情况下看看

#5


原始套接字方式是在IP层对SOCKET进行编程,所以需要你在接收后对结构进行分析和过滤。

#6


该回复于2010-02-23 16:37:03被版主删除

#7


原始套接字的收发可能是有你这个限制,
如果用系统socket可能没有这个问题吧?
SOCKET sock = socket(AF_INET, PROTOCAL_IP, 0);

#8


结贴通知:
请lz注意结贴。。。。