我正在使用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超时。有没有更好的方法来获取这些信息?
答案 0 :(得分:12)
答案 1 :(得分:0)
发送方是否需要知道其IP地址?
在发送UDP'寄存器'之后,客户端是否只能监听其尝试订阅的数据(在所有接口上)并让服务器开始将数据发送到数据报源自的地址? / p>