2011-11-23 13 views
2

私はICMPパケットを受け取ることができるPythonでソケットサーバーを作成しようとしています。ここでPython icmpソケットサーバー(tcp udpではない)

は私のコードです:

s = socket.socket(socket.AF_INET,socket.SOCK_RAW, socket.IPPROTO_ICMP) 
host = socket.gethostbyname(socket.gethostname()) 
s.bind((host,0)) 
s.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1) 
s.ioctl(socket.SIO_RCVALL, socket.RCVALL_ON) 

しかし、私はパケットを受信する方法を知らない - 私はs.listenを使用してみましたが、それは失敗しました。 私は何が欠けているのか、間違った方向に完全に終わっていますか?

ありがとうございます!

+0

エラーメッセージは何ですか。 – MattH

答えて

3

私はツイストで前にこれをやったと私は、このようにソケットを設定します。受け入れ答えに

import socket 

def listen(): 
    s = socket.socket(socket.AF_INET,socket.SOCK_RAW,socket.IPPROTO_ICMP) 
    s.setsockopt(socket.SOL_IP, socket.IP_HDRINCL, 1) 
    while 1: 
    data, addr = s.recvfrom(1508) 
    print "Packet from %r: %r" % (addr,data) 
+0

s.recvfromメソッド呼び出しで1508とは何ですか? – sternr

+1

ICMPパケットの最大サイズをすばやく検索した結果。このパラメーターを指定する必要があります(一度に受信するデータの最大量)。はい、ネットワークとネットワークスタックによっては、これによって切り捨てられるより大きなパケットを受け取ることができます。データが見つからない場合は、この値を増やしてみてください。 – MattH

0

ビルは、このコードは、受信したICMPヘッダをアンパックし、そのデータ(ICMPタイプ、コードを表示しますなど)

s = socket.socket(socket.AF_INET,socket.SOCK_RAW,socket.IPPROTO_ICMP) 
    s.setsockopt(socket.SOL_IP, socket.IP_HDRINCL, 1) 
    while 1: 
     recPacket, addr = s.recvfrom(1024) 
     icmp_header = recPacket[20:28] 
     type, code, checksum, p_id, sequence = struct.unpack('bbHHh', icmp_header) 
     print "type: [" + str(type) + "] code: [" + str(code) + "] checksum: [" + str(checksum) + "] p_id: [" + str(p_id) + "] sequence: [" + str(sequence) + "]" 
関連する問題