發送/接收對由層實現的answers
方法定義。
例如,這裏是爲IP
層answers
方法:
def answers(self, other):
if not isinstance(other,IP):
return 0
if conf.checkIPaddr and (self.dst != other.src):
return 0
if ((self.proto == socket.IPPROTO_ICMP) and
(isinstance(self.payload, ICMP)) and
(self.payload.type in [3,4,5,11,12])):
# ICMP error message
return self.payload.payload.answers(other)
else:
if ((conf.checkIPaddr and (self.src != other.dst)) or
(self.proto != other.proto)):
return 0
return self.payload.answers(other.payload)
你想要做的是開發自己的answers(request, potential_response)
功能和接收原始數據包。然後,您使用您的answers
函數來決定哪些原始數據包是答案。
要獲得原始數據包,您可以使用sniff
功能:
sniff(count=1,timeout=0.001)
雖然你發現,它的缺點是它並不一定及時啓動。所以,你想看看sniff
的實施方式。它在內部使用conf.L2listen
,您也可以使用它。
所以,在發送請求之前,先做s=conf.L2listen()
然後再做s.recv(65536)
來接收數據包。您可以使用sel = select([s],[],[],0.001)
等待數據包到達的一定時間。如果s in sel[0]
,則可以從套接字讀取數據,否則超時已過。
timeout參數以秒爲單位,所以我的所有示例都指定了1毫秒的超時時間。