1

我们正在使用 C/C++ 在 Linux 上开发服务器软件,该软件将限制来自 Internet 的请求的下载速率,但对于来自本地机器(内联网)的请求,它不会设置任何限制。

问题是如何判断一个IP地址是否是本地的,是否可以通过读取一些网络号设置(可能来自路由器?)通过c/c++来做到这一点?

更新
当我说本地 ip 时,我的意思是它来自公司内部。例如,假设公司有 3 个子网(这家公司只有一个 DSL 连接互联网),它们是 10.123.1.xxx、172.16.1.xxx 和 192.168.1.xxx,那么这三个子网的所有 ip 地址应视为本地地址。

4

2 回答 2

1

私有地址范围是:

10.0.0.0 - 10.255.255.255 (10/8 prefix)

172.16.0.0 - 172.31.255.255 (172.16/12 prefix)

192.168.0.0 - 192.168.255.255 (192.168/16 prefix)

您可能还想过滤掉链接本地地址 (169.254/16)

然后,您可以解析代码中的 IP 地址(以获取您可以使用 avahi 或类似内容的地址,并将所有地址保存到文件中,然后单独解析每个地址)并检查它是否与这些地址匹配。如果没有,则限制其连接

编辑

您还可以考虑使用列出本地地址的getifaddrs函数

于 2013-11-14T13:39:10.347 回答
0

如果您traceroute在请求连接的机器的 IP 地址上运行 a,您应该能够看到该路由是否将您带到“公司外的网关”(通常是您的 ISP)。我家中的一个简单示例是我的内部路由器连接到的时代华纳网关。如果到客户端的路由不通过 ISP(正如您提到的,您有一个 DSL 链接;因此应该知道 DSL 端点的 IP 地址),那么这是一个内部请求。这不需要您知道公司内部 IP 地址的完整映射 - 您可以假设您的路由器已经弄清楚了。

要获取此信息,您可以从程序内部运行系统命令并解析响应。

首先,从命令行运行它(使用已知的“内部”和“外部”IP 地址),然后查看差异。如果之后您需要进一步的帮助,请使用您收集的信息更新您的问题。

于 2013-11-14T17:08:35.057 回答