在 C/Unix 中的 IP 子网上侦听的套接字

Socket listening on an IP subnet in C / Unix

本文关键字:套接字 子网 IP Unix 中的      更新时间:2023-10-16

>我正在尝试用 C 语言编写服务器-客户端套接字程序。目标是让服务器侦听特定端口,但侦听属于同一 IP 子网的 IP 地址范围。此 IP 子网是 127.x.x.x 范围的一部分(当然不是 127.0.0.1)。

需要注意的几点:

  • 这是一个基于流的套接字,而不是数据报套接字。
  • 这不是广播地址。
  • 仅在 Unix/Linux 平台上实现 C/C++

我不想在服务器上为范围内的每个 IP 地址打开多个套接字。这是不可扩展的。

任何帮助将不胜感激。这甚至可行吗?

您只能绑定到单个套接字上的一个地址。 为什么不能绑定到INADDR_ANY并简单地拒绝任何未绑定到目标 IP 的数据包? 或者,您可以绑定到任意端口并使用操作系统级别的魔法(例如iptables,bpf)将发往这些IP/端口组合的数据包重新路由到您的套接字。

套接字 API 不允许绑定到子网 - 您可以绑定到一个 IP 或任何 IP。您可以侦听所有入站连接,并拒绝不适用的入站连接。如果需要在同一服务器上的进程之间划分连接,请使用单个侦听套接字,并将传入连接传输到工作进程。

您可以使用防火墙来阻止所需子网外部的任何人进行连接(即在 o/s 级别)。 您可以将套接字置于混杂模式并接受给定接口上的所有连接。 我不知道你是否可以同时做这两件事(有一个混杂模式的套接字并在其上运行iptables)。 从本质上讲,这就像构建一个只侦听一个端口的数据包嗅探器。