具有python3.8和多处理功能的Traceroute IP

问题描述

我需要跟踪路由某些IP地址。我为每个地址创建进程(使用multoprocessing模块)。但我得到相同的结果。 我不知道出什么问题了。也许我使用的是错误的多重处理。还是关于ICMPLIB。

我的代码

import multiprocessing as mp
from icmplib import traceroute


def tracerouting(target,q):  #tracerouting with icmplib

    data = traceroute(target)
    q.put(data)


if __name__ == "__main__":

    q = mp.Queue()
    targetList = ['google.com','mail.ru']
    #creating processes for addresses
    processes = [mp.Process(target=tracerouting,args = (ip,q))for ip in targetList]


    for p in processes:
        p.start()

    for p in processes:
        p.join()

    print('Queues')

    #printind data
    for p in processes:
        data = q.get()
        print(data)

执行结果:

队列 [] [ ]

解决方法

我也在我的项目中使用此库。我主要使用ping和multiping函数,但通常它与traceroute函数的作用相同。

根据我在项目页面(https://github.com/ValentinBELYN/icmplib#traceroute上看到的内容),必须为每个流程使用不同的标识符,以使响应与请求相匹配。默认情况下,每次调用都会使用程序的PID,因此可能会发生冲突。由于要并行化多个跟踪路由,因此建议您为每个进程分配一个唯一的ID(0到65535之间)。

否则为什么要对这种任务使用多重处理?线程似乎更合适。

traceroute(address,id=YOUR_THREAD_ID)

最后,要回答您的另一个问题,不,您的所有traceroute之间没有共享套接字。有RAW插槽(非常低的水平)。处理IP和ICMP标头很重要,但不如DGRAM或STREAM套接字灵活。 RAW套接字可以接收不适合它们的ICMP消息,并且icmplib之类的库通常使用标识符和序列号(自动递增)来将响应与请求进行匹配。这就是为什么,我建议您在traceroute之间不要使用相同的标识符:)

我认为这应该可以解决您的问题。