Linux-app无法从169.254.x获取UDP消息.X(本地链路)
Linux-app does not get UDP messages from 169.254.x.x (local link)
我的应用程序(用c++编写,运行在Ubuntu 9.10上)正在监听来自外部设备的UDP套接字广播消息。这些设备可以有任何IP地址,因为其思想是在IP范围之外进行通信。
当设备有IP地址,如99.99.1.2,1.2.3.4,0.0.0.1,192.168.2.77等,它工作正常(PC本身是192.168.1.110)。但是:当设备具有169.254.x时,它不起作用。x(本地链接块),应用程序不会得到消息。没有防火墙运行,且Wireshark 显示提示信息,说明连接正常。我假设问题在IP堆栈的某个地方(我打开设备/dev/eth2并获得套接字,所以没有什么特别的)。
有什么原因或解决方案吗?非常感谢。
确保eth2有一个IP地址和网络掩码,并且该IP地址和网络掩码使其与设备处于同一IP网络中。使用命令ifconfig
查看这些详细信息。
看来我找到原因了。无论如何,感谢那些提出解决方案的人。
我没有提到我的Ubuntu是在VM中运行的(这基本上不是问题,因为Wireshark收到了消息)
接口有:eth2是我上面谈到的接口(因此,它通过广播进行外部通信)。它是一个"桥接"。
此外,我已经实现了一个内部"仅主机"网络接口eth4与其他虚拟机通信。
我还为eth2添加了一个"default"路由,否则广播通信根本无法工作。
然而,我没有注意到的是自动插入的"link-local"路由指向eth4。所以我得出结论,系统使用这个来处理所有169.254.x。X消息,我的应用程序不再接收它们。
有两种方法解决了我的问题:
- 完全禁用eth4或
-
使用
删除"link-local"路由route del -net 169.254.0.0 netmask 255.255.0.0 dev eth4
下面是删除路由之前的路由表:
Ziel Router Genmask Flags Metric Ref Use Iface
192.168.230.0 * 255.255.255.0 U 1 0 0 eth4
192.168.1.0 * 255.255.255.0 U 1 0 0 eth2
link-local * 255.255.0.0 U 1000 0 0 eth4
default * 0.0.0.0 U 10 0 0 eth2
现在我可以愉快地接收来自我想要的设备的所有数据包。
当你的ip为169.254.x.x时,确保rp_filter在你想接收广播UDP的所有接口上关闭
# sysctl -A | grep '.rp_filter'
net.ipv4.conf.all.rp_filter = 0
net.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.lo.rp_filter = 0
net.ipv4.conf.eth0.rp_filter = 0
net.ipv4.conf.eth1.rp_filter = 0
使用
设置rp_filter# sysctl -w net.ipv4.conf.eth0.rp_filter=0
您需要仔细检查您是否有防火墙阻止它们。在linux上,您可能使用iptables。使用该命令来列出你的规则。许多发行版使用iptables实现防火墙,但是隐藏这是你的事实。
路由器不应该转发来自192..的数据包。*因为那不是一个"可路由"的子网。它应该只用于内部/本地使用。如果在源和目标之间有路由器或网桥,那可能是问题所在。如果你在同一台机器上安装了wireshark,它可以监听数据包去看看他们,那就不是问题了。
您可以使用netstat来确保您的程序实际上正在侦听。输入"netstat -an -p UDP"查看所有正在侦听UDP数据包的程序。
- vscode g++链路故障:体系结构x86_64的未定义符号
- GLFW DDS 加载函数的 OpenGL 链路错误
- QBS 为静态链路 MSVC 创建静态库
- VS 链路错误描述中的"@@YAHXZ"是什么意思?
- 数据结构:多(A)对多(B)关系,每个链路也有自己的数据(C)
- 在 OpenGL 计划链路状态检查期间"No definition of main in vertex shader"
- 提升单元测试链路错误
- C++ shared_ptr基于单调导致链路错误的原因
- 为什么Typedef结构会产生链路故障
- 链路寄存器 (LR) 是否受内联函数或裸函数的影响
- 如何查找 IP 地址是否为链路本地地址
- C 程序检测物理链路状态和数据包丢失
- 如何处理系统链路控制的NM_CLICK
- MPG123 链路错误"_read"和"_lseek"
- 在VS2012中使用时出现log4cplus链路错误
- C、 所有平台中进程的C++CPU使用率和内存使用率+当前时间的可用网络下行链路带宽
- Parasoft c++测试链路单元测试错误
- 在ns3中的两个节点之间创建无线链路
- 设置链路顺序和LINK_INTERFACE_MULTIPLICITY
- Linux-app无法从169.254.x获取UDP消息.X(本地链路)