2011-11-23 190 views
2

我想在Python中編寫一個套接字服務器,可以接收ICMP數據包。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) + "]"