在C中过滤Linux上的UDP环回

时间:2009-12-09 16:34:22

标签: c linux sockets udp

我有一个绑定到eth0的应用程序,在端口A上发送​​UDP数据包到255.255.255.255。同时,我有一个绑定到eth0,0.0.0.0和端口A的UDP服务器。

我想要做的是确保服务器不会接收应用程序生成的消息(内核纯粹用软件处理),但它会接收网络中其他主机生成的消息。

我无法更改UDP数据包的有效负载,也无法为其添加任何标头。

我已经使用RTNETLINK实现了一个解决方案来获取我正在坐的机器的所有IP地址(并根据recvfrom()的地址进行过滤),但我想知道是否有更简单更清洁的地方溶液

编辑:我想过像标记skb这样的东西 - 标签在离开物理接口后就会消失,但如果它只是在软件中路由的话就不会消失。

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

如果您可以修补Linux内核,可以使用setsockopt()选项来选择是否要回送您正在发送的广播数据包。

patch完全重用了IP_MULTICAST_LOOP选项。

此外,您可以轻松添加自己的IP_MULTICAST_LOOP选项(可能称为setsockopt()),而不是使用IP_BROADCAST_NO_LOOP选项“搞乱”。这可以保证您不会更改任何其他应用程序的行为。

答案 1 :(得分:0)

您可以在有效负载上计算校验和或CRC(更好),并根据此进行过滤。

答案 2 :(得分:0)

您可以在防火墙级别通过将数据包丢弃到源地址为eth0的广播地址端口A来执行此操作。