Python:获取用于将IP数据发送到特定远程IP地址的本地IP地址

时间:2011-09-07 13:04:19

标签: python ip

我正在使用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超时。有没有更好的方法来获取这些信息?

2 个答案:

答案 0 :(得分:12)

答案 1 :(得分:0)

发送方是否需要知道其IP地址?

在发送UDP'寄存器'之后,客户端是否只能监听其尝试订阅的数据(在所有接口上)并让服务器开始将数据发送到数据报源自的地址? / p>