使用 asyncore 实现 gethostbyaddr()

Implement gethostbyaddr() with asyncore

我在 socket.gethostbyaddr() 上玩得很开心,搜索如何加速一个非常简单的随机生成一些 IP 地址的代码并尝试解决它们。当找不到主机时就会出现问题,超时可能会很长(大约 10 秒...)

偶然发现这篇文章,他用多线程解决了问题:https://www.depier.re/attempts_to_speed_up_gethostbyaddr/

我想知道是否可以使用 Asyncore 做一些等效的事情?这就是我最初尝试做的,但惨遭失败...

这是一个模板:

import socket
import random

def get_ip():
    a = str(random.randint(140,150))
    b = str(random.randint(145,150))
    c = str(random.randint(145,150))

    for d in range(100):
        addr = a + "." + b + "." + c +"."+ str(1 + d) 
        yield addr

for addr in get_ip():               
    try:
        o = socket.gethostbyaddr(addr)
        print addr + "...Ok :"
        print "---->"+ str(o[0])
    except:
        print addr + "...Nothing"

您正在寻找一种将多个 IP 并行转换为名称(或相反)的方法。基本上它是一个 DNS request/response 操作并且 gethostbyaddr 正在同步执行此查找,即以阻塞方式。它发送请求,等待响应,returns结果。

asyncio 和类似的库使用所谓的协程和协作调度。合作意味着编写协程来支持并发。一个 运行ning 协程显式 returns 控制(使用 await 或 yield from)等待调度程序然后选择另一个协程并 运行s 它直到那个 returns 控制等等。一次只能 运行ning 一个协程。为了顺利 运行 协同程序不得在不返回控制权的情况下执行更长时间的代码。协程中的阻塞操作会阻塞整个程序。禁止使用 gethostbyaddr.

一个解决方案需要支持异步 DNS 查找。协程发送 DNS 请求,设置超时,安排将 DNS 响应传递给它和 returns 控制。因此,多个协程可以在等待所有响应之前一个接一个地发送请求。

异步 DNS 有第三方库,但我从未使用过。查看 aiodns 个示例,编写您要查找的代码似乎很容易。 asyncore.gather 大概是这个功能的核心吧。