如何使用 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.0
到 0.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 long
和 to_ulong()
等函数允许您对原始数字表示进行各种位摆弄,并将结果更改回 address_v4
。
【讨论】:
以上是关于如何使用 boost asio 进行 IP 地址操作(屏蔽、or'ing 等)?的主要内容,如果未能解决你的问题,请参考以下文章
如何获取 boost::asio::ip::tcp::socket 的 IP 地址?
Boost asio socket:如何获取IP,连接的端口地址?
使用 boost asio udp 套接字时如何设置本地端点
如何接受boost :: asio :: ssl :: stream 作为boost :: asio :: ip :: tcp :: socket类型的参数