我试图在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。
答案 0 :(得分:5)
你正在使用一个聪明的技巧来获得你的服务器"真实"可能有多个网络接口打开时的地址。 serversocket.bind((socket.gethostname(), 8089))
可以细分为
hostname = socket.gethostname()
dns_resolved_addr = socket.gethostbyname(hostname)
serversocket.bind((dns_resolved_addr, 8089))
您获取本地主机名,然后询问DNS它认为您的IP地址是什么,并绑定到该地址。这是外部连接将使用的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'