接受Linux上的UDP广播数据包(Receiving UDP broadcast packets

2019-07-04 08:44发布

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

我一直在使用一对夫妇模仿套接字API调用监控软件使用,以测试不同的场景的Python 2.x的脚本。 如果发件人使用单播(10.1.0.5),而不是广播(10.1.0.255)的Linux内核数据包传递到接收器的软件。 我一直在寻找了好几天的网页,并没有发现同样的问题的人。 有任何想法吗?

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()

Answer 1:

好吧,我建议在评论这个答案,并在实践中证明是正确的。 我想调查我自己的代码周围的细微差别进一步,但这是规范的情况下,更接近。

除了设置SO_BROADCAST两侧套接字选项(因为你已经做正确),则还必须绑定您的接收到广播地址(例如, INADDR_BROADCAST ,这是255.255.255.255,基本上起到同样的作用INADDR_ANY单播)。

显然,在原海报的HP-UX配置,UDP套接字绑定到单播地址(或INADDR_ANY ,特别是),但与SO_BROADCAST套接字选项组仍然将接收所有的UDP数据报给当地的广播地址以及单播交通冲着主机。

在Linux下,这种情况并非如此。 结合UDP套接字,即使SO_BROADCAST -启用,到INADDR_ANY不足以绑定端口上同时接收单播和广播数据包。 可以使用一个单独的INADDR_BROADCAST结合的SO_BROADCAST插座用于广播流量。



文章来源: Receiving UDP broadcast packets on Linux