我正在尝试实现一个 python traceroute,它发送 UDP 消息并通过原始套接字接收 ICMP 响应。我遇到了一个问题,ICMP 数据包似乎不惜一切代价避免捕获。ICMP 响应正如我所期望的那样在wireshark 中显示,但套接字从不接收任何要读取的数据。另一个复杂之处是我在运行 Ubuntu 的 VirtualBox 上运行代码,因为 sendto() 不会在 Windows 7 中获取数据包。(我在 Windows 中运行 wireshark 来捕获数据包)。奇怪的是,当我从虚拟机运行 python 脚本时,wireshark 会捕获 ICMP 消息。但是,当我尝试在 Windows 上运行脚本时,ICMP 消息不会显示在wireshark 中。(UDP 数据包神奇地开始在 Windows 上工作)
我已经从在线示例中尝试了各种不同版本的设置套接字,并且使用了 bind() 而没有使用它,但似乎没有配置产生读取的套接字。等待读取 ICMP 消息将超时。
还应该注意的是,如果我尝试读取我的 udp 发送套接字,它会成功读取 udp 数据包。一旦我设置 IPPROTO_ICMP 读取超时。
接收响应方法:
def receive_response(rec_socket, packetid, tsend, timeout):
remain = timeout
print packetid
while remain > 0:
ready = select.select([rec_socket], [], [], remain)
if ready[0] == []:
return
print 'got something'
设置套接字:
rec_socket = socket.socket(socket.AF_INET, socket.SOCK_RAW, ICMP_CODE)
rec_socket.setsockopt(socket.SOL_IP, socket.IP_HDRINCL, 1)
rec_socket.bind(("",0)) #played with using this statement and skipping it
呼叫接收很简单:
reached = receive_response(rec_socket, packetid, time.time(), timeout)