【发布时间】:2014-05-27 08:58:01
【问题描述】:
我不明白为什么要以这种方式创建套接字
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 的方法来查看广播时通过接口发送了哪些消息?
-
什么操作系统?如果是 Linux 似乎非 root 是不可能的github.com/netty/netty/issues/576 你需要使用 0.0.0.0 或者只是一个单独的套接字
-
您可以尝试绑定到子网广播地址(例如 192.168.1.255,取决于您的设置),正如这里所说的 stackoverflow.com/questions/13666789/…
-
socket()函数接受三个参数,我认为第三个在任何情况下都不是可选的。 -
并注意端口号。它们应始终包含在
htons()中,以便您在代码中看到实际的端口号,而不是字节顺序颠倒的数字。