[英]Python: UDP socket's recvfrom returning localhost or external IP
我有一個使用兩個UDP套接字的客戶端程序,一個用於偵聽,另一個用於編寫。
OUT_SOCKET = socket(AF_INET, SOCK_DGRAM) # write-only UDP
IN_SOCKET = socket(AF_INET, SOCK_DGRAM) # read-only UDP
我在兩個不同端口上的localhost上運行該程序,並相互發送消息。
OUT_SOCKET.sendto(some_msg, (ip, port))
我讀到這樣的消息。
msg, addr = IN_SOCKET.recvfrom(MAX_MSG_SIZE)
問題是,當我在接收客戶端上為ip指定127.0.0.1(用於發送some_msg
)時, addr
設置為127.0.0.1。 但是,當我從發送客戶端將IP指定為192.168.XX(我的外部IP地址)時,接收客戶端的addr
設置為192.168.XX
我希望無論如何設置ip
addr
都是一致的。 recvfrom
行為是否取決於發送方指定ip地址的方式?
recvfrom如何提取遠程地址? 是什么導致recvfrom
行為不同?
從recvfrom
返回的地址特別是接收到的數據包中的源IP地址。 使用sendto
發送UDP數據包時,IP堆棧將選擇適當的接口來發送數據包。 recvfrom
不表現不同, sendto
選擇基於IP路由規則的源網絡接口。
在您的情況下,您有兩個網絡接口-一個正在偵聽目標地址為127.0.0.1
數據包,另一個正在偵聽192.168.xy
使用sendto
發送數據包時,它必須源自可以路由到目標地址的網絡接口。
當您將數據包發送到127.0.0.1
,它將源自回送地址(例如127.0.0.1
)。 當您將數據包發送到192.168.xy
,它將源自第二個網絡接口。 在這兩種情況下,從recvfrom
返回的對等IP地址都將標識發送網絡接口。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.