Вы не собираетесь делать какие-либо арифметические действия c со значениями, уже закодированными в сетевом порядке байтов. В этом случае вы, вероятно, добавляете только к старшему байту.
Быстрый ответ таков:
uint32_t val_n = htonl(init_val);
val_n += htonl(1);
не эквивалентно
uint32_t val = init_val;
val += 1;
uint32_t val_n = htonl(val);
Где val
и init_val
- обычные значения порядка хостов, а val_n
- кодированные порядковые номера сети.
Значения сетевых порядков не нужны для арифметического c напрямую. Вы не знаете, какое значение htonl(1)
добавит к вашему значению, и вы не знаете, что при его добавлении следующий байт перевернется после того, как вы доберетесь до 255 на младшем байте. Не рассматривайте значения сетевого порядка как числа, думайте о них как о непрозрачных значениях со значением.
Сохраняйте все, с чем вы работаете, в порядке хоста, как действительные числа:
uint32_t addr;
for (addr = addr_min; addr <= addr_max; addr += 1) {
uint32_t addr_net_order = htonl(addr);
...
}
где addr
, addr_min
и addr_max
- все порядки хостов , т.е. , если addr_min
должно быть 1.2.0.0
, addr_min = 0x01020000
.