129:      inet_ntop(AF_INET, &inetaddr->sin_addr,

130:       nameBuf, sizeof(nameBuf)));

131:   } else if (addr->ai_family == PF_INET6) {

132:    struct sockaddr_in6 * inetaddr =

133:     (void*)addr->ai_addr;

134:    char nameBuf[INET6_ADDRSTRLEN];

135:

136:    if (serviceName)

137:     printf(' порт%d', ntohs(inetaddr->sin6_port));

138:

139:    if (hostName)

140:     printf(' хост%s',

141:      inet_ntop(AF_INET6, &inetaddr->sin6_addr,

142:       nameBuf, sizeof(nameBuf)));

143:   }

144:

145:   if (addr->ai_canonname)

146:    printf(' name%s', addr->ai_canonname);

147:

148:   printf(' ');

149:

150:   addr = addr->ai_next;

151:  }

152:

153:  /* очистить результаты getaddrinfo() */

154:  freeaddrinfo(result);

155:

156:  return 0;

157: }

В отличие от большинства библиотечных функций, getaddrinfo() возвращает целое число, которое равно нулю в случае успеха, и описывает ошибку в случае неудачи. Такие функции, как правило, не используют errno. В табл. 17.3 описаны различные коды ошибок, которые могут возвращать подобные функции.

Таблица 17.3. Ошибки поиска соответствия адреса и имени

Ошибка Описание
EAI_AGAIN Имя не может быть найдено. Повторный поиск может оказаться успешным.
EAI_BADFLAGS В функцию переданы недействительные флаги.
EAI_FAIL В процессе поиска соответствия возникла постоянная ошибка.
EAI_FAMILY Семейство адресов не распознано.
EAI_MEMORY Запрос на выделение памяти не выполнен.
EAI_NONAME Имя или адрес невозможно преобразовать.
EAI_OVERFLOW Переданный буфер слишком мал.
EAI_SERVICE Для данного типа сокета служба не существует.
EAI_SOCKTYPE Был передан недействительный тип сокета.
EAI_SYSTEM Произошла системная ошибка; сама ошибка содержится в переменной errno.

Коды ошибок можно преобразовать в строки, описывающие проблему, с помощью функции gai_strerror().

#include <netdb.h>

const char * gai_strerror(int error);

Здесь параметр error должен быть ненулевым значением, возвращенным функцией getaddrinfo(). Если произошла ошибка EAI_SYSTEM, то для получения более точного описания программа должна использовать strerror(errno).

17.5.6. Преобразование адресов в имена

К счастью, переводить IP-адреса и номера портов в имена хостов и служб гораздо проще, чем наоборот.

#include <sys/socket.h>

Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

Вы можете отметить интересные вам фрагменты текста, которые будут доступны по уникальной ссылке в адресной строке браузера.

Отметить Добавить цитату