2011-11-23 102 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) + "]"