2013-03-30 17 views
2

我正在面对使用UDP套接字与Python发送和接收消息的问题。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作为地址,那么情况也是如此。为什么?通过事先对你的答案

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) 

感谢:

我工作在Linux上使用Python 2.7,这是ifconfig的执行结果。

回答

4

当您执行这条线在您的接收器:

sock.bind((UDP_IP, UDP_PORT)) 

要绑定只能由UDP_IP指定的地址。因此,您的套接字将只接收发送到该地址的数据包。这就是为什么当你匹配你的发件人和收件人的地址时,它是有效的。

如果你想在任何地址接收数据包,结合这样的代替:

sock.bind(('', UDP_PORT)) 

由于documented,指定''使得bind绑定到所有可用地址。

+0

非常感谢。它现在有效! –

+0

使用“0.0.0.0”即“任何ipv4地址”可能会更安全 - 虽然有代码注释说''表示任何地址,但create_connection的文档说它选择了默认的os。 –

+0

'套接字'模块文档(链接在我的答案中)说“空字符串代表'INADDR_ANY'” - 你会完成同样的事情。 – zigg

相关问题