c - 在 C 中过滤 Linux 上的 UDP 环回

标签 c linux sockets udp

我有一个绑定(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/

相关文章:

sockets - boost asio udp waitForReadyRead

java - 创建原始数据包以欺骗 UDP 数据包

c - 为什么使用无限 for 循环添加无符号整数会得到错误的结果?

linux - linux中有电话框架吗?

linux - 检查 Linux 中给定进程的开放 FD 限制

在centos上配置mesos时出现Python错误

Java BufferedReader 接收空字符串

C 标准库的完整在线引用?

c - 在 C 中反转字符串中的单词

c - 谐波平均产生不正确的结果