在Linux上接收UDP广播数据包

goo*_*ose 10 linux udp broadcast

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

我一直在使用一些python 2.x脚本来模仿监控软件用来测试不同场景的套接字API调用.如果发送方使用单播(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()
Run Code Online (Sandbox Code Playgroud)

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()
Run Code Online (Sandbox Code Playgroud)

Mat*_*all 13

好吧,我在评论中提出了这个答案,并且在实践中证明是正确的.我想用我自己的代码进一步调查周围的细微差别,但这是规范的案例 - 更接近.

除了SO_BROADCAST在两侧设置套接字选项(正如您已正确执行的那样)之外,还必须将接收器绑定到广播地址(例如,INADDR_BROADCAST255.255.255.255,并且基本上与INADDR_ANY单播相同).

显然,在原始海报的HP-UX配置中,绑定到单播地址(或者INADDR_ANY,特别是)但使用SO_BROADCAST套接字选项集的UDP套接字仍将接收寻址到本地广播地址的所有UDP数据报以及单播流量定向在主持人.

在Linux下,情况并非如此.绑定UDP套接字,即使在SO_BROADCAST启用时,INADDR_ANY也不足以在绑定端口上接收单播和广播数据报.可以使用单独的INADDR_BROADCAST绑定SO_BROADCAST套接字来进行广播流量.

  • 我们的解决方案实际上是绑定到子网广播地址而不是"INADDR_BROADCAST".此外,我们运行模拟环境,我们希望接收单播而不是广播,因此这不是最终的解决方案.但是,如果您编辑`INADDR_BROADCAST`,我会点击复选标记. (3认同)
  • 出于好奇,这是否记录在任何地方? (2认同)