将 UDP 套接字绑定到("", 1234)
or("0.0.0.0", 1234)
时,是否可以找出它实际发送的 IP 地址?
正如您在下面的代码中看到的那样,getsockname
只告诉我我绑定的内容。但是当我发送一个数据包时,我可以看到 IP 地址在我的例子中是10.0.0.2
.
我是否必须通过查看我的网络接口自己推断此地址?如果是这样,那很好,但是有没有一种可靠的方法呢?
from socket import *
s = socket(AF_INET, SOCK_DGRAM)
s.bind(("", 1234))
print(s.getsockname()) # prints ("0.0.0.0", 1234)
s.sendto("hello", ("10.0.0.3", 1234)) # sends from 10.0.0.2
我试过做
import socket
print(socket.gethostbyname(socket.gethostname()))
但这似乎不是很可靠(在我期望的情况下10.0.0.2
,我得到了127.0.1.1
)。
我意识到通过绑定到0.0.0.0
,我绑定到所有本地网络接口。这是否意味着当我尝试发送某些内容时,我的源 IP 地址将由路由表确定?如果是这样,我仍然可以从 Python 以可靠的方式获取该地址吗?