Я всегда так делаю (в вашем случае cidr = 24):
uint32_t ipv4Netmask;
ipv4Netmask = 0xFFFFFFFF;
ipv4Netmask <<= 32 - cidr;
ipv4Netmask = htonl(ipv4Netmask);
Это будет работать только с ipv4Netmask, чтобы быть на самом деле uint32_t, не делайте его int, так как int не должен быть 32-битным в каждой системе. Результат преобразуется в сетевой порядок байтов, как и ожидают большинство системных функций.
Обратите внимание, что этот код завершится ошибкой, если cidr
равен нулю, так как тогда код сместит 32-битную переменную на 32 бита и, поверьте или нет, это неопределенное поведение в C. Можно ожидать, что результат всегда будет ноль, но стандарт C говорит, что это не определено с самого начала. Если ваш CIDR может быть нулевым (что будет разрешено только в любом заполнителе IP-адреса 0.0.0.0/0), тогда код должен перехватывать особый случай.