Я хочу собрать и отправить несколько пакетов ICMP с одним процессом и получить ответы от другого, чтобы работать с эхо-ответом ICMP (например, отправка трассировки на недоступные хосты). Для этой проблемы я использую scapy. Я уже тестировал его без многопроцессорности и встроенных методов 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. Порядок пакетов ответов не очень важен.