c - 如何不接收错误子网的 UDP 数据报但仍然广播?

标签 c linux sockets udp posix

我的接口(interface) eth0 设置为 168.152.32.222,网络掩码为 255.255.255.0。

我的服务器应用程序现在想要接收 eth0 上具有以下目标地址的 UDP 数据报:

  1. 168.152.32.222
  2. 168.152.32.255
  3. 255.255.255.255

这似乎是一个相当合理的请求,但我无法正确绑定(bind)套接字。

  • 如果我绑定(bind)到 168.152.32.222,我将不会收到广播。
  • 如果我绑定(bind)到 INADDR_ANY,我会从所有接口(interface)获取数据报。
  • 如果我绑定(bind)到 INADDR_ANY 和 SO_BINDTODEVICE,我会收到到达不同子网 eth0 的数据包,例如 168.152.47.x。

理论上,我可以接受数据报,然后再次使用网络掩码自行过滤掉所有错误的数据包 - 但认真地说,某些较低层应该这样做,这在某种程度上就是网络掩码的要点。

如何不接收错误子网的 UDP 数据报但仍然广播?

服务器应用程序之外的解决方案也是可以接受的。我正在考虑使用 iptables 过滤数据包,但不确定这是否可行,这将是最后的手段。

最佳答案

在你的应用服务器上,如果你不关心其他udp数据包,你可以像这样设置iptables规则:

iptables -F # flush filter rules
iptables -A INPUT -p udp -s 168.152.32.0/24 -d 162.152.32.222/32 -j ACCEPT # accept udp packets from 168.152.32.0/24 network to 162.152.32.222 host
iptables -A INPUT -p udp -s 168.152.32.0/24 -d 255.255.255.255/32 -j ACCEPT # accept udp packets from 168.152.32.0/24 network to 255.255.255.255/32 broadcast address 
iptables -A INPUT -p udp -s 168.152.32.0/24 -d 168.152.32.255/32 -j ACCEPT # accept udp packets from 168.152.32.0/24 network to 168.152.32.255/32 broadcast address
iptables -A INPUT -p udp -j DROP # drop all other incoming udp packets

或者您应该考虑接受所有广播的数据包,然后在代码中手动过滤网络的 src 地址。您的网络规模较小,可能使用 IP_ADD_SOURCE_MEMBERSHIP 过滤 setsockopt 选项就足够了。

关于c - 如何不接收错误子网的 UDP 数据报但仍然广播?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32863475/

相关文章:

c - 在 C 中重新分配二维数组

python - 如何使用 python 创建 tcsh 别名?

linux - 释放物理内存页面并强制页面错误

c# - TCP Socket.Connect 正在生成误报

矩阵批量乘法的Cuda程序

用于清理 openssl EVP_PKEY 私钥内存的 C 代码

Linux 如何调试操作系统卡住问题

Java套接字性能瓶颈: where?

sockets - 数据包和套接字有什么区别?

c - 在节点中存储一个 int