是否有可能使用scapy使用其他进程/线程来接收ping答复

问题描述 投票:0回答:1

我想通过一个进程构建并发送一些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数据包。答案包的顺序不是很重要。

python sockets multiprocessing ping scapy
1个回答
0
投票

实际上将嗅探参数更改为a = sniff(iface='enp0s3', filter="icmp", count=0)即可完成工作。由于变量ascapy.plist.PacketList,因此您可以对其进行迭代以获取每个单个数据包的信息。访问ping例如信息如下:

[a[i].getlayer(ICMP).type => i =包裹号。

© www.soinside.com 2019 - 2024. All rights reserved.