所以,我尝试使用的非常简单的代码在这里:http://wiki.python.org/moin/UdpCommunication
(也在这里): 发送:
import socket
UDP_IP = "127.0.0.1"
UDP_PORT = 5005
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.sendto(MESSAGE, (UDP_IP, UDP_PORT))
接收:
import socket
UDP_IP = "127.0.0.1"
UDP_PORT = 5005
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
当我在我的计算机上运行这两个应用程序时,代码工作正常。我将发送代码放在我的笔记本电脑上:
UDP_IP="IP address for my computer"
其他都是一样的。然而,什么也没有发生。我做错了什么?我用了wireshark,确定正在收发数据包;但是,python 程序没有收到数据包。我很困惑。
非常感谢任何帮助。 提前致谢。
最佳答案
尝试绑定(bind)到接收方的所有本地接口(interface):
sock.bind(("", UDP_PORT)) # could also use "0.0.0.0"
请注意,在接收 UDP 数据包时,操作系统的行为在绑定(bind)方面并不完全合乎逻辑(也不一致),尤其是对于多播流量。这是您得到的行为:
Linux:绑定(bind)到特定 IP 将过滤传入的 UDP 数据包,只有针对该特定 IP 的数据包才能通过过滤器。这意味着,例如,当绑定(bind)到 IP 192.168.1.100 时,IP 为 192.168.1.100 的接口(interface)接收到的组播 UDP 数据包将不会被接收。在 Linux 上,正常绑定(bind)不绑定(bind)到接口(interface)。为此使用 setsockopt(SO_BINDTODEVICE)。绑定(bind)到 0.0.0.0(或 Python 上的“”)将始终接收机器在所有接口(interface)上接收到的所有 UDP 数据包,而不管目标 IP,因此这通常是 Linux 上最有用的选项。
Windows:绑定(bind)到特定 IP 将绑定(bind)到属于该 IP 的接口(interface),非常类似于 setsockopt(SO_BINDTODEVICE) 在 Linux 上的作用。传入的 UDP 数据包不会被此 IP 过滤,因此即使绑定(bind)到具体 IP 也可以接收多播流量。 (这可能是我第一次觉得 Windows 行为比 Linux 行为更一致。)
Python 不会为套接字抽象出这些特定于操作系统的差异(就像在其他领域所做的那样)。只要您没有明确的理由不这样做,我建议始终绑定(bind)到 0.0.0.0。
关于python - 简单的 Python UDP 服务器 : trouble receiving packets from clients other than localhost,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15734219/