Asyncio套接字,Localhost与本地IP

时间:2018-07-20 16:30:07

标签: python sockets server client python-asyncio

我有一个正在编写的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时,为什么它们不在那里?

2 个答案:

答案 0 :(得分:0)

其他字段似乎与IPv6 address scoping有关。

另请参阅socket.getnameinfosocket.getpeername

答案 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地址。