#include
int inet_aton(const char * strptr , struct in_addr * addrptr );
Возвращает: 1, если строка преобразована успешно, 0 в случае ошибки
in_addr_t inet_addr(const char * strptr );
Возвращает: 32-разрядный адрес IPv4 в сетевом порядке байтов: INADDR_NONE в случае ошибки
char *inet_ntoa(struct in_addr inaddr );
Возвращает: указатель на строку с адресом в точечно-десятичной записи
Первая из названных функций, inet_aton
, преобразует строку, на которую указывает strptr
, в 32-разрядное двоичное число, записанное в сетевом порядке байтов, передаваемое через указатель addrptr
. При успешном выполнении возвращаемое значение равно 1, иначе возвращается нуль.
ПРИМЕЧАНИЕ
Функция inet_aton обладает одним недокументированным свойством: если addrptr — пустой указатель (null pointer), функция все равно выполняет проверку допустимости адреса, содержащегося во входной строке, но не сохраняет результата.
Функция inet_addr
выполняет то же преобразование, возвращая в качестве значения 32-разрядное двоичное число в сетевом порядке байтов. Проблема при использовании этой функции состоит в том, что все 2 32возможных двоичных значений являются действительными IP-адресами (от 0.0.0.0 до 255.255.255.255), но в случае возникновения ошибки функция возвращает константу INADDR_NONE
(обычно представленную двоичным числом, состоящим из 32 бит, установленных в единицу). Это означает, что точечно-десятичная запись 255.255.255.255 (ограниченный адрес для широковещательной передачи IPv4, см. раздел 18.2) не может быть обработана этой функцией, поскольку ее двоичное значение выглядит как указание на сбой при выполнении функции.
ПРИМЕЧАНИЕ
Характерной проблемой, сопровождающей выполнение функции inet_addr, может стать то, что, как утверждается в некоторых руководствах, в случае ошибки она возвращает значение -1 вместо INADDR_NONE. С некоторыми компиляторами это может вызвать проблемы при сравнении возвращаемого значения функции (значение без знака) с отрицательной константой.
На сегодняшний день функция inet_addr
является нерекомендуемой, или устаревшей, и в создаваемом коде вместо нее должна использоваться функция inet_aton
. Еще лучше использовать более новые функции, описанные в следующем разделе, работающие и с IPv4, и с IPv6.
Функция inet_ntoa
преобразует 32-разрядный двоичный адрес IPv4, хранящийся в сетевом порядке байтов, в точечно-десятичную строку. Строка, на которую указывает возвращаемый функцией указатель, находится в статической памяти. Это означает, что функция не допускает повторного вхождения, то есть не является повторно входимой (reentrant), что мы обсудим в разделе 11.14. Наконец, отметим, что эта функция принимает в качестве аргумента структуру, а не указатель на структуру.
ПРИМЕЧАНИЕ
Функции, принимающие структуры в качестве аргументов, встречаются редко. Более общим способом является передача указателя на структуру.
3.7. Функции inet_pton и inet_ntop
Эти функции появились с IPv6 и работают как с адресами IPv4, так и с адресами IPv6. Их мы и будем использовать в книге. Символы p
и n
обозначают соответственно формат представления и численный формат. Формат представления адреса часто является строкой ASCII, а численный формат — это двоичное значение, входящее в структуру адреса сокета. #include
int inet_pton(int family , const char * strptr , void * addrptr );
Возвращает: 1 в случае успешного выполнения функции: 0, если входная строка имела неверный формат представления; -1 в случае ошибки
const char *inet_ntop(int family , const void * addrptr ,
char * strptr , size_t len );
Возвращает: указатель на результат, если выполнение функции прошло успешно. NULL в случае ошибки
Значением аргумента family
для обеих функций может быть либо AF_INET
, либо AF_INET6
. Если family
не поддерживается, обе функции возвращают ошибку со значением переменной errno
, равным EAFNOSUPPORT
.
Первая функция пытается преобразовать строку, на которую указывает strptr
, сохраняя двоичный результат с помощью указателя addrptr
. При успешном выполнении ее возвращаемое значение равно 1. Если входная строка находится в неверном формате представления для заданного семейства ( family
), возвращается нуль.
Функция inet_ntop
выполняет обратное преобразование: из численного формата ( addrptr
) в формат представления ( strptr
). Аргумент len
— это размер принимающей строки, который передается, чтобы функция не переполнила буфер вызывающего процесса. Чтобы облегчить задание этого размера, в заголовочный файл включаются следующие определения:
Читать дальше
Конец ознакомительного отрывка
Купить книгу