在Linux上接收UDP广播数据包

我们有现有软件周期性地将UDP数据包广播到本地子网(xxx255)上的特定端口(7125)。 我们有在HP-UX(11.11)上运行的监控软件,能够接收这些数据包没有问题。 但是,将监控软件移植到Linux(RHEL 6.1)之后,我们发现它没有收到广播数据包。 tcpdump显示到达Linux主机的数据包,但内核不会将它们发送到我们的软件。

我一直在使用一些python 2.x脚本来模拟socket API调用监视软件用来testing不同的场景。 如果发送方使用单播(10.1.0.5),而不是广播(10.1.0.255),则Linux内核将数据包传递给接收方软件。 我一直在网上search几天,并没有发现任何人有同样的问题。 有任何想法吗?

receiver.py

from __future__ import print_function import socket localHost = '' localPort = 7125 remoteHost = '10.1.0.5' remotePort = 19100 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) s.bind((localHost, localPort)) s.connect((remoteHost, remotePort)) print('Listening on {0}:{1} for traffic from {2}:{3}'.format(localHost, localPort, remoteHost, remotePort)) data = s.recv(1024) print('Received: {0}'.format(data)) s.close() 

sender.py

 from __future__ import print_function import socket import time localHost = '' localPort = 19100 remoteHost = '10.1.0.255' remotePort = 7125 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) s.bind((localHost, localPort)) s.connect((remoteHost, remotePort)) data = 'sending this from {0}:{1} to {2}:{3}'.format(localHost, localPort, remoteHost, remotePort) print(data) print('2') time.sleep(1) print('1') time.sleep(1) s.send(data) print('sent at {0}'.format(time.ctime())) s.close() 

Solutions Collecting From Web of "在Linux上接收UDP广播数据包"

那么,我在评论中提出了这个答案,实践证明是正确的。 我想用我自己的代码进一步调查周围的细微差别,但是这是规范的情况。

除了在双方设置SO_BROADCAST套接字选项之外(如你已经正确地做的那样),你还必须将你的接收器绑定到广播地址(例如, INADDR_BROADCAST ,它是255.255.255.255,基本上与单播的INADDR_ANY具有相同的作用)。

很明显,在原始海报的HP-UX配置中,绑定到单播地址(或INADDR_ANY ,具体而言)但具有SO_BROADCAST套接字选项集的UDP套接字仍将接收所有发往本地广播地址的UDP数据报以及单播指向主机的流量。

在Linux下,情况并非如此。 将一个UDP套接字绑定到INADDR_ANY ,即使在启用了SO_BROADCAST ,也不足以接收绑定端口上的单播和广播数据报。 对于广播流量,可以使用单独的INADDR_BROADCAST套接字SO_BROADCAST套接字。