如何使用 boost asio 进行 IP 地址操作(屏蔽、or'ing 等)?

How do I do IP address manipulation (masking, or'ing, etc) with boost asio?

我有一个应用程序要安装到多个环境中,每个环境都有相同的相对 IP 地址。

举例来说,假设有三个设备(它比这复杂得多,但为了简单起见,我已将其缩减)。设备和环境到IP地址的映射如下:

Environ A, baseline = 192.0.0.0, range = 192.0.0.0 - 192.0.1.255
           device-1 = OR:0.0.0.5   = 192.0.0.5
           device-2 = OR:0.0.0.200 = 192.0.0.200
           device-3 = OR:0.0.1.17  = 192.0.1.17

Environ B, baseline = 192.0.2.0, range = 192.0.2.0 - 192.0.3.255
           device-1 = OR:0.0.0.5   = 192.0.2.5
           device-2 = OR:0.0.0.200 = 192.0.2.200
           device-3 = OR:0.0.1.17  = 192.0.3.17

Environ C, baseline = 192.0.4.0, range = 192.0.4.0 - 192.0.5.255
           device-1 = OR:0.0.0.5   = 192.0.4.5
           device-2 = OR:0.0.0.200 = 192.0.4.200
           device-3 = OR:0.0.1.17  = 192.0.5.17

Environ D, baseline = 192.0.6.0, range = 192.0.6.0 - 192.0.7.255
           device-1 = OR:0.0.0.5   = 192.0.6.5
           device-2 = OR:0.0.0.200 = 192.0.6.200
           device-3 = OR:0.0.1.17  = 192.0.7.17

在这种情况下,每个设备的 IP "or-address" 的 IP 地址为 0.0.0.00.0.1.255(最右边的九位)。

每个环境的基线 IP 因此是最左边 23 位(很像在路由表中找到的),而每个设备 IP 地址可以通过 ORing 获得基准 IP)。

因此,任何给定的设备都可以以这种方式计算出其环境中所有其他设备的 IP 地址(它从自己的 IP 地址获取基线)。 环境之间无需通信。

所以我有几件事需要做(强烈倾向于使用 Boost,因为我希望它可以跨多个平台移植)。

1/ 我需要能够获取当前设备的本地 IP 地址,请记住只有一个地址,因此不必担心多 NIC 或多宿主。

2/ 我需要能够将最右边的 N 位归零,然后将该值与另一个地址进行或运算。

完成这些任务最简单的方法是什么?完成后,获取字符串表示(或直接使用最终地址)应该很容易。

您可以使用 boost::asio::ip::address_v4 class 来做到这一点。

construction from unsigned long and to_ulong() 这样的函数允许您对原始数字表示进行各种位摆弄,并将结果改回 address_v4