Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x Traceroute IP与python3.8和多处理_Python 3.x_Multiprocessing_Icmp - Fatal编程技术网

Python 3.x Traceroute IP与python3.8和多处理

Python 3.x Traceroute IP与python3.8和多处理,python-3.x,multiprocessing,icmp,Python 3.x,Multiprocessing,Icmp,我需要追踪一些IP地址。我为每个地址创建进程(使用multoprocessing模块)。但我得到了同样的结果。 我不知道是什么问题。也许我使用的多重处理不正确。或者是关于ICMPLIB的 我的代码: import multiprocessing as mp from icmplib import traceroute def tracerouting(target, q): #tracerouting with icmplib data = traceroute(target)

我需要追踪一些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函数的工作原理相同

从我在项目页面()上看到的情况来看,您必须为每个流程使用不同的标识符,以便将响应与请求相匹配。默认情况下,每次调用都会使用程序的PID,因此可能存在冲突。由于您希望并行化多个跟踪路由,我建议您为每个进程分配一个唯一的ID(介于0和65535之间)

否则,为什么要对此类任务使用多处理?线似乎更合适

traceroute(address, id=YOUR_THREAD_ID)
最后,回答您的另一个问题:不,在所有跟踪路由之间没有共享套接字。存在原始套接字(极低级别)。有必要处理IP和ICMP头,但不如DGRAM或流套接字灵活。原始套接字可以拾取不适合它们的ICMP消息,像icmplib这样的库通常使用标识符和序列号(自动递增)来匹配响应和请求。这就是为什么,我建议您不要在跟踪路由之间使用相同的标识符:)


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

我假设每个进程都在访问单个套接字。这导致了混乱。