У меня есть небольшой фрагмент кода, который преобразует 32-разрядное целое без знака (то есть: uint32_t
) в набор из четырех 8-битных полей, обрабатывает его как IP-адрес, а затем сообщает клиенту, если он попадает в заданный диапазон IP-адресов.Стандартный/безопасный способ проверить, находится ли IP-адрес в диапазоне/подсети
Я already found несколько different examples кода в C, который показывает мне, как получить IP-адрес клиента из struct sockaddr_in
, который его содержит, по with a C# answer. Тем не менее, я хотел бы, чтобы сломать адрес немного дальше, держите его в чистом C, и хотел бы знать несколько простых вещей:
- это внутреннее представление согласуется от системы к системе, или я когда-нибудь понадобится делать проверки/коррекции Endian-ness на поле
s_addr
? - Существуют ли стандартные макросы по линиям
CLASS_C_NETMASK
,CLASS_B_NETMASK
и т. Д., Что было бы более подходящим, чем использование созданных вручную масок (то есть:0xFF000000
,0x00FF0000
и т. Д.). - Существуют ли существующие функции в библиотеке сокетов, которые будут проверять, находится ли IP-адрес в диапазоне IP-адресов или соответствует маске подсети?
Спасибо.
's_addr' всегда находится в« сетевом порядке байтов », который является big-endian. – zneak
Вы не ошибетесь, глядя на [** Руководство Beej по программированию сети **] (http://beej.us/guide/bgnet/). Добавьте это в список ссылок/примеров для проверки. (его другие гиды хороши также) –
@ DavidC.Rankin Спасибо.Хорошая рекомендация к книге очень ценится, так как вопросы, касающиеся «хороших книг по теме xzy», почти мгновенно закрываются на SO. :) – DevNull