我想通过一个进程构建并发送一些ICMP数据包,并在另一个进程上接收答案,以便与ICMP回显应答一起工作(例如,向无法访问的主机发送跟踪路由)。对于这个问题,我使用scapy。我已经在没有多处理的情况下对其进行了测试,并内置了诸如srp1()
/ sr()
之类的时髦方法或使用了套接字s.send(packet)
,这些方法对于我来说都是很慢的。 s.send(packet)
变体是仅发送软件包的最快方法,但是我想使用答案,但是还没有找到接收它们的方法。
packet = Ether()/IP(dst='192.168.0.0/24')/ICMP()
packets = [p for p in packet]
s = conf.L2socket(iface='enp0s3')
for p in packets:
s.send(p)
到目前为止,我尝试使用一种发送过程和一种接收过程。
def sendICMP():
print('sending...')
packet = Ether()/IP(dst='192.168.0.0/24')/ICMP()
packete = [p for p in packet]
s = conf.L2socket(iface='enp0s3')
for p in packete:
s.send(p)
def recvICMP():
print('receiving...')
s = conf.L2socket(iface='enp0s3')
a = sniff(iface='enp0s3', filter="icmp and src 192.168.0.1", count=256)
print(a[0].getlayer(ICMP).type)
if __name__ == '__main__':
p1 = multiprocessing.Process(target=sendICMP)
p2 = multiprocessing.Process(target=recvICMP)
p1.start()
p2.start()
p1.join()
p2.join()
这不起作用。使用两个进程在同一套接字上发送和侦听是否是一个问题?线程在这里会做得更好吗?我还想到的是,我可以使用一个队列,在其中可以放入ICMP请求的响应,但是我不知道该怎么做。基本上,我正在寻找一种非常高性能的可能性来发送和接收很多ICMP数据包。答案包的顺序不是很重要。
实际上将嗅探参数更改为a = sniff(iface='enp0s3', filter="icmp", count=0)
即可完成工作。由于变量a
是scapy.plist.PacketList
,因此您可以对其进行迭代以获取每个单个数据包的信息。访问ping例如信息如下:
[a[i].getlayer(ICMP).type
=> i =包裹号。