Python UDP套接字在回环地址上没有接收到消息

3

我在使用Python的UDP套接字发送和接收消息时遇到问题。

问题在于当我尝试使用此代码发送和接收消息时,我无法接收任何内容:Receiver.py:

import socket

UDP_IP = "127.0.0.1"
UDP_PORT = 55681
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind((UDP_IP, UDP_PORT))
while True:
     data, addr = sock.recvfrom(1024) # buffer size is 1024 bytes
print "received message:", data

Sender.py:

import socket

UDP_IP = "192.168.1.161"
UDP_PORT = 55681
MESSAGE = "Hello, World!"

print "UDP target IP:", UDP_IP
print "UDP target port:", UDP_PORT
print "message:", MESSAGE

sock = socket.socket(socket.AF_INET, # Internet                                 
                 socket.SOCK_DGRAM) # UDP                                   
sock.bind((UDP_IP, UDP_PORT))
sock.sendto(MESSAGE, (UDP_IP, UDP_PORT))

但是,如果我通过以下方式更改接收器的代码:

import socket

UDP_IP = "192.168.1.161"
UDP_PORT = 55681

sock = socket.socket(socket.AF_INET, # Internet                                                                                                                       
                 socket.SOCK_DGRAM) # UDP                                                                                                                         
sock.bind((UDP_IP, UDP_PORT))

while True:
    data, addr = sock.recvfrom(1024) # buffer size is 1024 bytes                                                                                                      
print "received message:", data

它完美地运作。 如果我在两个程序中都将地址设置为127.0.0.1,情况也是一样的。为什么?

我在Linux上使用Python 2.7,以下是ifconfig的结果:

lo        Link encap:Local Loopback  
      inet addr:127.0.0.1  Mask:255.0.0.0
      inet6 addr: ::1/128 Scope:Host
      UP LOOPBACK RUNNING  MTU:16436  Metric:1
      RX packets:12252 errors:0 dropped:0 overruns:0 frame:0
      TX packets:12252 errors:0 dropped:0 overruns:0 carrier:0
      collisions:0 txqueuelen:0 
      RX bytes:1528301 (1.5 MB)  TX bytes:1528301 (1.5 MB)

wlan0     Link encap:Ethernet  HWaddr 00:21:6a:5b:b4:dc  
      inet addr:192.168.1.161  Bcast:192.168.1.255  Mask:255.255.255.0
      inet6 addr: XXXX::XXX:XXXX:XXXX:XXXX/64 Scope:Link
      UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
      RX packets:532561 errors:0 dropped:0 overruns:0 frame:0
      TX packets:318747 errors:0 dropped:0 overruns:0 carrier:0
      collisions:0 txqueuelen:1000 
      RX bytes:629969205 (629.9 MB)  TX bytes:32669218 (32.6 MB)

提前感谢您的回答。

1个回答

7
当您在接收器中执行此行时:
sock.bind((UDP_IP, UDP_PORT))

您只绑定了由UDP_IP指定的地址。因此,您的套接字仅接收发送到该地址的数据包。这就是为什么在匹配发送者和接收者地址时它能够工作的原因。

如果您希望在任何地址上接收数据包,请改为像这样绑定:

sock.bind(('', UDP_PORT))

文档所述,指定''将使bind绑定到所有可用地址。

使用“0.0.0.0”可能更安全,这是“任何IPv4地址”,尽管有一个代码注释说“''”表示任何地址,但create_connection的文档说它选择操作系统默认值。 - andrew cooke
“socket”模块文档(在我的回答中链接)说:“空字符串表示INADDR_ANY”,这样你就可以完成相同的事情。 - zigg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接