我正在使用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))