將UDP套接字綁定到("", 1234)
或("0.0.0.0", 1234)
時,是否可以找出它實際發送的IP地址?當綁定到0.0.0.0時查找源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中以強大的方式獲得該地址嗎?
通過綁定到您可以從所有接口接收的所有接口。發送時,數據包將從數據包發送的實際接口獲取其源設置。您可能必須手動檢查路由表以瞭解將用於特定地址的接口。 –