嗨,我有一个脚本可以保持我设备的端口状态,这是简化版本。
当连接成功(设备存在)时,我关闭连接,连接状态变为 TIME_WAIT。准时此连接起球并达到操作系统允许的最大连接(如果我记得的话)
知道我应该修复哪个部分,例如,我使用端口 53,但在实际应用程序中,我检查多个端口,如 ssh、vnc 等。
我使用 python 3.5.6 在 ubuntu 18.04 上运行脚本
import asyncio
import ipaddress
import sys
async def check_port(ip, port, timeout=1):
conn = None
response = False
writer = None
try:
conn = asyncio.open_connection(ip, port)
reader, writer = await asyncio.wait_for(conn, timeout=timeout)
response = True
except asyncio.CancelledError:
print("asyncio cancel")
except:
response = False
finally:
if writer is not None:
writer.close()
if conn is not None:
conn.close()
print("Closing connection {}:{}".format(ip, port))
print("{}:{} {}".format(ip, port, response))
async def poll_status():
ips = [str(ip) for ip in ipaddress.IPv4Network("192.168.1.0/24")]
while True:
try:
tasks = [check_port(ip, 53) for ip in ips]
await asyncio.wait(tasks)
except asyncio.CancelledError:
break
except KeyboardInterrupt:
break
except:
pass
await asyncio.sleep(1)
async def shutdown(task):
task.cancel()
await task
await asyncio.sleep(1)
if __name__ == "__main__":
loop = asyncio.get_event_loop()
task = asyncio.ensure_future(poll_status())
try:
loop.run_forever()
except:
pass
finally:
loop.run_until_complete(asyncio.wait([shutdown(task)]))
loop.close()
连接一直像这样堆积(“netstat -nput | grep TIME_WAIT”的输出)192.168.1.1 是我的路由器,所以它在检查端口时成功,但留下了很多未关闭的连接。删除连接需要很长时间
tcp 0 0 192.168.1.4:42102 192.168.1.1:53 TIME_WAIT -
tcp 0 0 192.168.1.4:42582 192.168.1.1:53 TIME_WAIT -
tcp 0 0 192.168.1.4:46560 192.168.1.1:53 TIME_WAIT -
tcp 0 0 192.168.1.4:39428 192.168.1.1:53 TIME_WAIT -
tcp 0 0 192.168.1.4:45806 192.168.1.1:53 TIME_WAIT -
tcp 0 0 192.168.1.4:44752 192.168.1.1:53 TIME_WAIT -
tcp 0 0 192.168.1.4:40726 192.168.1.1:53 TIME_WAIT -
tcp 0 0 192.168.1.4:49864 192.168.1.1:53 TIME_WAIT -
tcp 0 0 192.168.1.4:38812 192.168.1.1:53 TIME_WAIT -
tcp 0 0 192.168.1.4:48464 192.168.1.1:53 TIME_WAIT -
tcp 0 0 192.168.1.4:41372 192.168.1.1:53 TIME_WAIT -
tcp 0 0 192.168.1.4:43408 192.168.1.1:53 TIME_WAIT -
tcp 0 0 192.168.1.4:47360 192.168.1.1:53 TIME_WAIT -
tcp 0 0 192.168.1.4:45478 192.168.1.1:53 TIME_WAIT -
tcp 0 0 192.168.1.4:41904 192.168.1.1:53 TIME_WAIT -
tcp 0 0 192.168.1.4:40160 192.168.1.1:53 TIME_WAIT -
tcp 0 0 192.168.1.4:46196 192.168.1.1:53 TIME_WAIT -
tcp 0 0 192.168.1.4:48744 192.168.1.1:53 TIME_WAIT -
tcp 0 0 192.168.1.4:49554 192.168.1.1:53 TIME_WAIT -
tcp 0 0 192.168.1.4:47774 192.168.1.1:53 TIME_WAIT -
tcp 0 0 192.168.1.4:39370 192.168.1.1:53 TIME_WAIT -
tcp 0 0 192.168.1.4:43994 192.168.1.1:53 TIME_WAIT -