我用Python3的socketserver模块创建一个简单的TCP服务器。我想获取服务器所服务的服务器的IP。
我注意到socketserver(而不是BaseServer)中有一个server_address
属性,但返回' 0.0.0.0'对于知识产权。我也尝试使用socket
对象并运行gethostbyname()
,但是python说套接字对象没有属性gethostbyname
。例如:
server = socketserver.TCPServer(...)
print(server.server_address) # gives me ('0.0.0.0', [correct port])
print(server.socket.gethostbyname()) # AttributeError
根据我的理解,0.0.0.0保留用于"未知",因此服务器没有看到它的IP。那是对的吗?解决方案可能是什么?
答案 0 :(得分:1)
在没有外部服务器帮助的情况下,这是不可能的,因为您和另一台计算机之间可能有任意数量的网络地址转换器(NAT)。我想如果你正在使用某种自定义协议,你可以要求客户端断言它所连接的地址。
考虑到这一点(许多人会认为这是一个黑客),但它可以说是唯一的方法 - 你可以做类似的事情:
import urllib.request
external_ip = urllib.request.urlopen('http://ifconfig.me/ip').read()
答案 1 :(得分:1)
套接字服务器中的0.0.0.0意味着您不必配置特定的网络接口IP地址以让服务器监听。现在它正在侦听所有服务器的可用IP地址(网络接口)
要获取服务器IP地址(如果可由DNS解析),您可以使用:
import socket
socket.gethostbyname(socket.getfqdn())