Ошибка | Описание |
---|---|
EAI_AGAIN | Имя не может быть найдено. Повторный поиск может оказаться успешным. |
EAI_BADFLAGS | В функцию переданы недействительные флаги. |
EAI_FAIL | В процессе поиска соответствия возникла постоянная ошибка. |
EAI_FAMILY | Семейство адресов не распознано. |
EAI_MEMORY | Запрос на выделение памяти не выполнен. |
EAI_NONAME | Имя или адрес невозможно преобразовать. |
EAI_OVERFLOW | Переданный буфер слишком мал. |
EAI_SERVICE | Для данного типа сокета служба не существует. |
EAI_SOCKTYPE | Был передан недействительный тип сокета. |
EAI_SYSTEM | Произошла системная ошибка; сама ошибка содержится в переменной errno . |
Коды ошибок можно преобразовать в строки, описывающие проблему, с помощью функции gai_strerror()
.
#include
const char * gai_strerror(int error);
Здесь параметр error
должен быть ненулевым значением, возвращенным функцией getaddrinfo()
. Если произошла ошибка EAI_SYSTEM
, то для получения более точного описания программа должна использовать strerror(errno)
.
17.5.6. Преобразование адресов в имена
К счастью, переводить IP-адреса и номера портов в имена хостов и служб гораздо проще, чем наоборот.
#include
#include
int getnameinfo(struct sockaddr * addr, socklen_t addrlen,
char * hostname, size_t hostlen,
char * servicename, size_tservicelen, intflags);
Здесь параметр addr
указывает либо на struct sockaddr_in
, либо на struct sockaddr_in6
, член addrlen
содержит размер структуры, на которую указывает addr
. IP-адрес и номер порта, определенные addr
, преобразуются в имя хоста, сохраняющееся в ячейке, на которую указывает hostname
, и в имя службы, сохраняющееся в servicename
.
Один из параметров может равняться NULL
, при этом функция getnameinfo()
не ищет соответствие имени для данного параметра.
Параметры hostlen
и servicelen
определяют, сколько байт доступно в буферах, на которые указывают hostname
и servicename
соответственно. Если ни одно имя не умещается в доступном пространстве, буфера переполняются и возвращается ошибка (EAI_OVERFLOW
).
Последний аргумент flags
изменяет способ, которым функция getnameinfo()
производит поиск имен. Параметр должен быть равен нулю или принимать одно или несколько (объединенных логическим "ИЛИ") из описанных ниже значений.