Python - 绑定UDP套接字到正确的地址

7
我不明白为什么如果我用这种方式创建套接字
from socket import *
s = socket(AF_INET, SOCK_DGRAM)
s.bind(("192.168.1.10",26000))
print s.recvfrom(4096)[0]

我尝试像这样向它发送广播包

from socket import *
s = socket(AF_INET, SOCK_DGRAM)
s.setsockopt(SOL_SOCKET, SO_BROADCAST, 1)
s.sendto("hey!", ("<broadcast>", 26000))

它不能正常工作(它在recvfrom()上挂起),但如果我尝试将其绑定到“0.0.0.0”,它可以正确接收数据包。

我知道0.0.0.0表示每个接口上的每个地址都将侦听该端口,但为什么直接绑定到地址会导致它无法接收数据包?

操作系统:OSX 10.9.2,Python版本:2.7.6

即使我没有运行Linux,我仍然尝试将套接字绑定到子网广播地址,结果相同。


你使用哪个操作系统?你尝试过类似Wireshark这样的工具来查看广播时发送到接口上的消息吗? - User
什么操作系统?如果是Linux,则似乎非root用户无法实现https://github.com/netty/netty/issues/576。您需要使用0.0.0.0或仅使用单独的套接字。 - Konstantin
您可以尝试绑定到子网广播地址(例如192.168.1.255,具体取决于您的设置),如此处所述:https://dev59.com/0WYr5IYBdhLWcg3wcJ10。 - Konstantin
socket()函数接受三个参数,我认为第三个参数在任何情况下都不是可选的。 - Pavel Šimerda
请参阅 https://docs.python.org/2/library/socket.html - 尽管我不认为在 AF_INET/AF_INET6 中省略协议是一个好主意。 - Pavel Šimerda
显示剩余3条评论
2个回答

4
如果操作系统是Linux,则尝试将套接字绑定到子网广播地址。例如,如果您的ifconfig设置为inet addr:192.168.0.62 Bcast:192.168.0.255 Mask:255.255.255.0,则将接收器套接字绑定到192.168.0.255。在Linux上,您将无法使用常规IP地址
关于该主题的先前讨论可以在这里找到。

2
为了监听广播数据包,您需要使用以下内容。
sock.bind(("<broadcast>", port_num))
or
sock.bind(("", port_num))

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