如何正确关闭使用local_addr的异步连接



我正在使用asyncio建立TCP连接,然后在一段时间后关闭它。我需要指定local_addr,因为主机上有许多可用的接口。

import asyncio
async def main():
print("Connecting...")
try:
reader, writer = await asyncio.open_connection('169.254.6.123', 55555, local_addr=('169.254.6.11', 15333))
except Exception as e:
print(e)
return

await asyncio.sleep(3)
writer.close()
ret = await writer.wait_closed()
print(ret)


asyncio.run(main())

这在第一次运行时运行良好,但在第二次运行时,我返回了一个错误:

[WinError 52]由于网络上存在重复的名称,您没有连接。

如果我没有设置local_addr,那么它可以正常工作(我必须禁用所有其他网络接口以确保它被路由,否则它会超时,因为"无法到达网络位置"-找不到路由(。

当设置了local_addr时,我在关闭连接时是否做错了什么?

如果我在尝试再次运行之前等待一段时间(我想一些缓存已清除??(,则在设置local_addr的情况下重试时,它会起作用。

不确定这是否只是Windows(使用Windows 10(上的问题

我正在重新使用端口…所以操作系统给出了错误。

local_addr端口设置为0,操作系统将选择该端口。请参阅此答案。

reader, writer = await asyncio.open_connection('169.254.6.123', 55555, local_addr=('169.254.6.11', 0))

最新更新