簡體   English   中英

Python:UDP套接字的recvfrom返回本地主機或外部IP

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM