当前位置: 首页 > 知识库问答 >
问题:

在Linux上接收UDP广播数据包

云丰
2023-03-14

我们现有的软件定期向本地子网(X.X.X.255)上的特定端口(7125)广播UDP数据包。我们的监控软件运行在HP-UX(11.11)上,可以接收这些数据包,没有问题。然而,在将监控软件移植到Linux(RHEL6.1)之后,我们发现它并没有接收到广播数据包。tcpdump显示了到达Linux主机的数据包,但内核不会将它们发送给我们的软件。

我使用了几个Python2.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()

sender.py

from __future__ import print_functhtml" target="_blank">ion
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()

共有1个答案

邵弘义
2023-03-14

嗯,我在一个评论中建议了这个答案,并且在实践中证明是正确的。我想用我自己的代码进一步研究周围的细微差别,但这是典型的情况-更接近。

除了在两侧设置so_broadcast套接字选项(正如您已经正确地做的那样)外,您还必须将接收器绑定到广播地址(例如,inaddr_broadcast,它是255.255.255.255,基本上与单播的inaddr_any起到相同的作用)。

显然,在原始poster的HP-UX配置中,绑定到单播地址(特别是inaddr_any)但设置了so_broadcast套接字选项的UDP套接字仍将接收发往本地广播地址的所有UDP数据报以及指向主机的单播流量。

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

 类似资料:
  • 我正在尝试接收通过LAN电缆连接的FPGA发送的UDP广播数据包。FPGA向端口5001发送连续数据包。 我的python接收器代码很简单: 我使用Wireshark进行了检查,发现PC接收数据包。但是,我的Python代码没有。我还检查了从另一个本地python代码发送数据包的情况(发送到相同的地址和端口),并且我的接收器获得了这些数据包。

  • 我正在尝试接收raspberry PI上的UDP数据包。我已经创建了一个简单的java程序来连接网络。(我下面有所有相关代码) 我不能从广播中接收到任何东西,在一个覆盆子圆周率。但当我在另一台计算机上运行此代码时,我能够从广播中接收数据包。这让我相信java没有被授予创建套接字、绑定端口的权限,并且它不是代码,而是raspberry PI上的一种安全措施。 null 没有运气。如有任何建议或帮助,

  • 问题内容: 在具有有线和无线接口(例如192.168.1.x和192.168.2.x子网)的Linux系统上,我要发送UDP广播,该广播通过所有可用接口(即通过有线和无线接口)发送)。 当前,我将sendto()发送到INADDR_BROADCAST,但是似乎广播仅通过其中一个接口发送(并不总是相同的,后续广播可能使用另一个接口)。 有没有一种方法可以发送通过每个接口发送的UDP广播? 问题答案:

  • 我们所有的例子这一点利用传输方式称为“单播”:“将消息发送给一个网络拥有唯一地址的目的地”,这种模式支持连接和无连接协议。 然而,UDP 提供了额外的传输模式对多个接收者发送消息: 多播:传送给一组主机 广播:传送到网络上的所有主机(或子网) 示例应用程序在本章将说明使用 UDP 广播发送消息,可以接收到所有主机在同一网络。为此我们将使用特殊的“有限广播”或“零”网络地址255.255.255.2

  • 问题内容: 有人可以解释和之间的确切区别吗? 在什么情况下我们必须使用每个Receiver类? 问题答案: 和之间只有一个区别。 当您收到内部广播方法时, 假设, BroadcastReceiver : 它 不保证 该 CPU将保持清醒 ,如果你启动一些长时间运行的进程。CPU可能会立即回到睡眠状态。 WakefulBroadcastReceiver : 这是 保证 该 CPU将保持清醒 ,直到你

  • 我不知道是网络配置还是我的软件出了问题。 这是监听代码: 奇怪的是,在wireshark上,我可以看到:数据包已从发送到,并且设备已对此数据包作出响应--来自的数据包已发送到。使用bind(0.0.0.0,端口)似乎不能涵盖。我迷路了,一点主意都没有。 ifconfig为: