我有一个绑定(bind)到 eth0 的应用程序,它在端口 A 上将 UDP 数据包发送到 255.255.255.255。同时,我有一个UDP服务器绑定(bind)到eth0,0.0.0.0和端口A。
我想做的是确保服务器不会接收应用程序生成的消息(由内核纯粹在软件中处理),但它会接收网络中其他主机生成的消息。
我无法更改 UDP 数据包的负载,也无法向其添加任何 header 。
我已经使用 RTNETLINK 实现了一个解决方案来获取我所在机器的所有 IP 地址(并根据 recvfrom() 中的地址进行过滤),但我想知道是否有更简单、更清晰的方法解决方案。
编辑:我想到了一些类似标记 skb 的事情——标签会在离开物理接口(interface)后消失,但如果它只是在软件中路由则不会。
有什么想法吗?
最佳答案
如果您可以修补您的 Linux 内核,您可以使用 setsockopt()
选项来选择是否要环回您正在发送的广播数据包。
这patch完全为此目的重用 IP_MULTICAST_LOOP
选项。
此外,您可以轻松添加自己的 setsockopt()
选项,而不是“弄乱”IP_MULTICAST_LOOP
选项,可能称为 IP_BROADCAST_NO_LOOP
.这将保证您不会更改任何其他应用程序的行为。
关于c - 在 C 中过滤 Linux 上的 UDP 环回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1875105/