首页 > 解决方案 > 如何将 asyncio create_connection 用于 IPv6 地址?

问题描述

在我的代码中,我尝试使用 asyncio create_connection 连接以使客户端连接到 TCP 服务器。出于某种原因,当我尝试使用 IPv4 地址时连接成功:

event_loop.create_connection(client_factory, host='127.0.0.1', port=8190)

但是当我使用 IPv6 地址时连接失败:

event_loop.create_connection(client_factory, host='::1', port=8190)

当我使用 IPv6 环回地址时,我得到一个 OSError:

Traceback (most recent call last):
  File "C:\Users\<removed>\AppData\Local\Programs\Python\Python36\lib\asyncio\base_events.py", line 778, in create_connection
    raise exceptions[0]
  File "C:\Users\<removed>\AppData\Local\Programs\Python\Python36\lib\asyncio\base_events.py", line 765, in create_connection
    yield from self.sock_connect(sock, address)
  File "C:\Users\<removed>\AppData\Local\Programs\Python\Python36\lib\asyncio\proactor_events.py", line 451, in sock_connect
    return self._proactor.connect(sock, address)
  File "C:\Users\<removed>\AppData\Local\Programs\Python\Python36\lib\asyncio\windows_events.py", line 511, in connect
    ov.ConnectEx(conn.fileno(), address)
OSError: [WinError 10022] An invalid argument was supplied

查看文档,看起来familycreate_connection 的参数默认为socket.AF_UNSPEC. 我还通过指定家庭尝试了相同的调用:

event_loop.create_connection(client_factory, host='::1', port=8190, family=socket.AF_INET6)

但我得到相同的结果。我知道将主机设置为'localhost'将适用于此示例,但我想知道如何将任何 IPv6 地址用于create_connection.

标签: pythonpython-3.xpython-2.7python-asyncio

解决方案


推荐阅读