UDPメッセージを送信し、rawソケットを介してICMP応答を受信するPythontracerouteを実装しようとしています。ICMPパケットがキャプチャを回避しているように見える問題が発生しました。ICMP応答は、私が期待するとおりにwiresharkに表示されますが、ソケットは読み取るデータを受信しません。もう1つの問題は、sendto()がWindows 7のネットワーク上でパケットを取得しないため、Ubuntuを実行しているVirtualBoxでコードを実行していることです(パケットをキャプチャするためにWindowsでwiresharkを実行しています)。奇妙なことに、仮想マシンからpythonスクリプトを実行すると、wiresharkがICMPメッセージをキャプチャします。ただし、Windowsでスクリプトを実行しようとすると、ICMPメッセージがwiresharkに表示されません。(UDPパケットは魔法のようにWindowsで動作し始めました)
オンラインの例からソケットを設定するさまざまなバージョンを試してみました。bind()を使用して使用せずに試してみましたが、読み取りを行うソケットを生成する構成はないようです。ICMPメッセージを読み取るのを待つだけでタイムアウトになります。
また、udp送信ソケットを読み取ろうとすると、udpパケットが正常に読み取られることにも注意してください。IPPROTO_ICMPを設定するとすぐに、読み取りがタイムアウトします。
receive_responseメソッド:
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)