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

Posted

技术标签:

【中文标题】如何使用 boost asio 进行 IP 地址操作(屏蔽、or\'ing 等)?【英文标题】:How do I do IP address manipulation (masking, or'ing, etc) with boost asio?如何使用 boost asio 进行 IP 地址操作(屏蔽、or'ing 等)? 【发布时间】:2017-06-27 04:18:09 【问题描述】:

我有一个要安装到多个环境中的应用程序,每个环境都有相同的相对 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“或地址”都为 0.0.0.00.0.1.255(包括最右边的 9 位)。

因此,每个环境的基线 IP 是 最左边 23 位(很像在路由表中找到的),而每个设备的 IP 地址可以通过将其或地址与基线 IP 进行或运算来获得)。

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

所以我有几件事需要做(我非常喜欢使用 Boost,因为我希望它可以跨多个平台移植)。

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

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

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

【问题讨论】:

this 对您的服务不够好? @πάνταῥεῖ - 我明白了!我正在查看address 本身,它没有to_ulong()。 IPv4 的确实 有这个,所以一旦我有一个 ulong,我可以轻松地摆弄它。谢谢(顺便说一句,您应该将其作为答案)。或者,如果群体认为它不值得保留,我可以将其删除 - 我会在几个小时后回来查看他们的裁决。 好吧,我有点避免回答低研究问题:-D。但我不得不承认,我们至少不容易找到骗子。 【参考方案1】:

您可以使用boost::asio::ip::address_v4 类来执行此操作。

construction from unsigned longto_ulong() 等函数允许您对原始数字表示进行各种位摆弄,并将结果更改回 address_v4

【讨论】:

以上是关于如何使用 boost asio 进行 IP 地址操作(屏蔽、or'ing 等)?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Boost.Asio 获取本地 IP 地址

使用 boost::asio 获取广播源 IP 地址

如何获取 boost::asio::ip::tcp::socket 的 IP 地址?

Boost asio socket:如何获取IP,连接的端口地址?

使用 boost asio udp 套接字时如何设置本地端点

如何接受boost :: asio :: ssl :: stream 作为boost :: asio :: ip :: tcp :: socket类型的参数