我有一个正在编写的Asyncio脚本。一切正常,但我对元组异步返回的地址有疑问。
根据我使用本地主机或本地IP地址与客户端连接的天气,这一行代码返回两种不同的结果。
(Server code)
addr = writer.get_extra_info('peername')
print("Received %r from %r" % (message, addr))
使用localhost作为客户端中的连接,我在服务器上看到了
(Client code)
reader, writer = await asyncio.open_connection('localhost', 8888, loop=asyncloop)
(Server prints)
Received 'Hello World!' from ('::1', 50402, 0, 0)
使用IP地址作为客户端中的连接,
(Client code)
reader, writer = await asyncio.open_connection('192.168.147.200', 8888, loop=asyncloop)
(Server prints)
Received 'Hello World!' from ('192.168.147.139', 50313)
第一个元组中两个零的含义是什么?当我连接IP时,为什么它们不在那里?
答案 0 :(得分:0)
其他字段似乎与IPv6 address scoping有关。
答案 1 :(得分:0)
请参见https://docs.python.org/3.5/library/socket.html?highlight=socket#socket-families
您的本地主机连接通过IPv6到达:
对于
AF_INET6
地址族,使用四元组(host, port, flowinfo, scopeid)
,其中 flowinfo 和 scopeid 代表sin6_flowinfo
和C语言sin6_scope_id
中的struct sockaddr_in6
个成员。对于socket
模块方法, flowinfo 和 scopeid 可以省略,只是为了向后兼容。但是请注意,省略 scopeid 可能会导致在处理作用域IPv6地址时出现问题。
您的显式IP地址连接是一个IPv4连接,为此:
一对
(host, port)
用于AF_INET
地址族,其中 host 是一个字符串,代表Internet域名表示法中的主机名,例如'daring.cwi.nl'。或IPv4地址(例如“ 100.50.200.5”),而 port 是整数。
主机名'localhost'
可以解析为IPv6或IPv4地址,而'192.168.147.200'
是显式的IPv4地址。