我有一个绑定到eth0的应用程序,在端口A上发送UDP数据包到255.255.255.255。同时,我有一个绑定到eth0,0.0.0.0和端口A的UDP服务器。
我想要做的是确保服务器不会接收应用程序生成的消息(内核纯粹用软件处理),但它会接收网络中其他主机生成的消息。
我无法更改UDP数据包的有效负载,也无法为其添加任何标头。
我已经使用RTNETLINK实现了一个解决方案来获取我正在坐的机器的所有IP地址(并根据recvfrom()的地址进行过滤),但我想知道是否有更简单更清洁的地方溶液
编辑:我想过像标记skb这样的东西 - 标签在离开物理接口后就会消失,但如果它只是在软件中路由的话就不会消失。有什么想法吗?
答案 0 :(得分:1)
如果您可以修补Linux内核,可以使用setsockopt()
选项来选择是否要回送您正在发送的广播数据包。
此patch完全重用了IP_MULTICAST_LOOP
选项。
此外,您可以轻松添加自己的IP_MULTICAST_LOOP
选项(可能称为setsockopt()
),而不是使用IP_BROADCAST_NO_LOOP
选项“搞乱”。这可以保证您不会更改任何其他应用程序的行为。
答案 1 :(得分:0)
您可以在有效负载上计算校验和或CRC(更好),并根据此进行过滤。
答案 2 :(得分:0)
您可以在防火墙级别通过将数据包丢弃到源地址为eth0
的广播地址端口A来执行此操作。