У меня есть приложение, которое предназначено для установки в нескольких средах, каждая с одинаковым родственник 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
включительно (самые правые девять бит).
Таким образом, базовый IP для каждой среды крайний слева 23 бита (как в таблицах маршрутизации), в то время как IP-адрес каждого устройства может быть получен с помощью ИЛИ или его-адреса с базовым IP-адресом).
Таким образом, любое данное устройство может обрабатывать IP-адреса всех других устройств в своей среде таким образом (оно получает базовую линию от своего собственного IP-адреса). Нет необходимости общаться между сред.
Поэтому у меня есть несколько вещей, которые мне нужно сделать (сильное предпочтение использовать Boost, поскольку я хочу, чтобы он был переносимым на несколько платформ).
1 / Мне нужно иметь возможность получать локальный IP-адрес текущего устройства, помня, что есть только один адрес, поэтому не нужно беспокоиться о мульти-NIC или множественной адресации.
2 / Мне нужно обнулить крайние правые N битов, а затем ИЛИ это значение другим адресом.
Какой самый простой способ сделать эти задачи? После этого получение строкового представления (или использование конечного адреса напрямую) должно быть простым.
Вы можете использовать boost::asio::ip::address_v4
класс для этого.
Есть такие функции, как строительство от unsigned long
а также to_ulong()
которые позволяют вам все виды манипулирования битами в представлении необработанных чисел, и изменить результаты обратно на address_v4
,
Других решений пока нет …