【发布时间】:2016-02-22 00:26:27
【问题描述】:
我是 Python3.5 的新手,除了在 Python 2.7 中少量使用 Twisted 外,我一般都是异步的。我正在将它构建到一个更大的应用程序中,我需要一小部分,而不是一个单一的框架,来执行 TCP 端口扫描。
import asyncio
from random import SystemRandom
def run(task, *, loop=None):
if loop is None:
loop = asyncio.get_event_loop()
return loop.run_until_complete(asyncio.ensure_future(task, loop=loop))
async def scanner(ip, port, loop=None):
fut = asyncio.open_connection(ip, port, loop=loop)
try:
reader, writer = await asyncio.wait_for(fut, timeout=0.5) # This is where it is blocking?
print("{}:{} Connected".format(ip, port))
except asyncio.TimeoutError:
pass
def scan(ips, ports, randomize=False):
if randomize:
rdev = SystemRandom()
ips = rdev.shuffle(ips)
ports = rdev.shuffle(ports)
for port in ports:
for ips in ips:
run(scanner(ip, port))
ips = ["192.168.0.{}".format(i) for i in range(1, 255)]
ports = [22, 80, 443, 8080]
scan(ips, ports)
这仍然需要与单个线程一样长的时间。我怎样才能把它变成一个异步 TCP 扫描器?
【问题讨论】:
标签: python-3.x asynchronous tcp python-asyncio