gpt4 book ai didi

Python socket.get 主机名

转载 作者:太空宇宙 更新时间:2023-11-03 13:38:22 27 4
gpt4 key购买 nike

我正在尝试用 Python 编写一个小型 Web 服务器来捕获 HTTP 帖子。但我对其中的 socket.gethostname 部分有疑问

这是我的示例代码

import socket

serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
serversocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
serversocket.bind((socket.gethostname(), 8089))
serversocket.listen(1)


while True:
connection, address = serversocket.accept()
buf = connection.recv(164)
print buf

如果我改变

serversocket.bind((socket.gethostname(), 8089))

serversocket.bind(("localhost", 8089))

一切正常,我可以通过 telnet 进入它,但我需要能够从互联网上的另一个 Web 服务器连接,所以我需要使用 socket.gethostname 但这会阻止我的 telnet。

最佳答案

当可能打开多个网络接口(interface)时,您正在使用一个聪明的技巧来获取您的服务器“真实”地址。 serversocket.bind((socket.gethostname(), 8089)) 可以分解为

hostname = socket.gethostname()
dns_resolved_addr = socket.gethostbyname(hostname)
serversocket.bind((dns_resolved_addr, 8089))

您获取本地主机名,然后询问 DNS 它认为您的 IP 地址是什么,并绑定(bind)到该地址。这是外部连接将使用的 IP 地址,因此您也应该使用它。

但它并不总是有效。 DNS 可能不知道您的服务器名称是什么,或者您的服务器在 DNS 中可能有不同的名称。一个例子是我的家庭网络,我没有 DNS 服务器,调制解调器分发的 DHCP 地址也没有出现在任何地方的名称服务器中。如果您的公司 DHCP 没有在其本地 DNS 中注册您的主机名,也会出现类似的问题。

在我的机器上,当我完成这些步骤时,我得到了

>>> socket.gethostbyname(socket.gethostname())
'127.0.1.1'

注意它是 127.0.1.1 ... 我认为这是 Ubuntu 的一些奇怪的东西,以防止其路由表混淆。无论如何,一种解决方案是尝试解析地址,如果您不喜欢它,则退回到默认值。

>>> my_ip = socket.gethostbyname(socket.gethostname())
>>> if my_ip.startswith('127.0.'):
... my_ip = '0.0.0.0'
...
>>> my_ip
'0.0.0.0'

关于Python socket.get 主机名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36138209/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com