最近在学习asyncio模块,写个利用携程扫描机器tcp端口的脚本实践一下。因为asyncio模块在windows下面进行网络连接是并发的限制是509(具体原因可以去百度),因此通过信号量限制并发数为500个携程扫描公司测试环境中的机器,耗时4分钟的样子,平均的tps约:65535/(4*60)=273
环境信息:
python版本:3.7.4,操作系统win10专业版
代码如下:
import asyncio
import time
async def scan_host(host,port,semaphore):
result_list = []
async with semaphore:
try:
reader, writer = await asyncio.open_connection(host, port)
if writer:
result_list.append(port)
writer.close()
except Exception as e:
pass
return result_list
async def run_scan_host(host):
print(time.asctime())
#加入信号量用于限制并数
semaphore = asyncio.Semaphore(500)
task_list = []
#扫描的端口范围1-65535
range_list = [i for i in range(1,65536)]
for port in range_list:
task_list.append(asyncio.create_task(scan_host(host,port,semaphore)))
#打印扫描到的端口
for res in asyncio.as_completed(task_list):
port = await res
if port:
print(port)
print(time.asctime())
#扫描的主机ip
host = "192.168.49.68"
asyncio.run(run_scan_host(host))
网友评论