【发布时间】:2011-11-12 03:46:28
【问题描述】:
我正在使用 Python 脚本将 UDP 数据包发送到服务器,该服务器将注册我的脚本以接收来自服务器的通知。该协议要求我发送我自己的 IP 地址和我想要接收这些通知的端口,因此这应该是可以从服务器网络访问的地址。
解决方案至少应该适用于 Windows XP 及更高版本,最好是 Mac OS X,因为这是我的开发平台。
第一步是获取我的任何接口的 IP 地址。我目前正在使用通常建议的方法来解析机器自己的主机名:
def get_local_address():
return socket.gethostbyname(socket.gethostname())
这只有时有效。目前返回172.16.249.1,这是VM Ware使用的虚拟接口的地址,所以这是个问题。
更好的方法是获取默认接口的 IP 地址,这在大多数情况下应该是正确的。
更好的方法是通过面向连接的协议(如 TCP)获取用于连接服务器的实际 IP 地址。我实际上可以得到那个地址,但不能不尝试打开连接:
def get_address_to_connect_to(server_addr):
non_open_port = 50000
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
s.connect((server_addr, non_open_port))
except socket.error:
pass
else:
s.close() # just in case
return s.getsockname()[0]
如果服务器无法访问或中间的恶意防火墙阻止 ICMP 数据包,这将阻止直到达到某个 TCP 超时。有没有更好的方法来获取这些信息?
【问题讨论】: