gpt4 book ai didi

python - 简单的 Python UDP 服务器 : trouble receiving packets from clients other than localhost

转载 作者:太空狗 更新时间:2023-10-29 19:36:49 24 4
gpt4 key购买 nike

所以,我尝试使用的非常简单的代码在这里: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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com