Получить запись сетевого хоста потоко-безопасным способом
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
struct hostent * gethostbyaddr_r( const void *addr,
socklen_t length,
int type,
struct hostent *result,
char *buffer,
int buflen,
int *h_errnop );
- addr
- Указатель на адрес в двоичном формате (т.е. не оканчивающийся
NULL
) в сетевом порядке байт.
- length
- Длина addr в байтах.
- type
- Тип адреса. В настоящее время должен быть
AF_INET
.
- result
- Указатель на struct hostent, где функция может хранить запись хоста.
- buffer
- Указатель на буфер, который функция может использовать во время операции для хранения записей базы данных хоста; buffer должен быть достаточно большим, чтобы вместить все данные, связанные с записью хоста. Буфера, размером 2 КБ обычно более чем достаточно; 256-байтовый буфер в большинстве случаев безопасен.
- buflen
- Размер буфера buffer.
- h_errnop
- Указатель на область памяти, где функция может сохранить значение h_errno в случае возникновения ошибки.
libsocket
Функция gethostbyaddr_r() является потокобезопасной версией gethostbyaddr(). Данная функция получает запись о сетевом хосте для хоста, указанного в addr. Аргумент addr - сетевой адрес указанного сетевого семейства type. Буфер для addr имеет рамер не меньше чем length байт.
Если требуется преобразовать текстовый адрес в формат, необходимый для использования в качестве addr для gethostbyaddr_r(), см. inet_pton().
Указатель на структуру struct hostent или NULL
в случае ошибки.
В случае возникновения ошибки, int
, на которую указывает h_errnop устанавливается в:
- ERANGE
- Предоставленный buffer не может вместить результат.
- HOST_NOT_FOUND
- Ответ, полученный непосредственно от сервера, который располагает информацией об указанном домене: неизвестный хост.
- NO_ADDRESS
- Нет адреса, связанного с именем; необходимо найти запись MX.
- NO_DATA
- Допустимое имя, однако отсутствует запись данных запрошенного типа. Имя известно серверу имен, но с ним не связан IP-адрес - это не является временной ошибкой. Другой тип запроса к серверу имен с использованием этого доменного имени даст ответ (например, для этого домена может быть зарегистрирован почтовый сервер пересылки).
- NO_RECOVERY
- Неизвестная ошибка сервера. Произошел непредвиденный сбой сервера. Неисправимая сетевая ошибка.
- TRY_AGAIN
- Ответ, полученный от промежуточного сервера: Ошибка поиска имени хоста. Обычно это временная ошибка и означает, что локальный сервер не получил ответа от полномочного сервера. Повторная попытка через некоторое время может быть успешной.
- /etc/hosts
- Файл, содержащий базу данных доменных имен.
- /etc/nsswitch.conf
- Конфигурационный файл для выбора соответствующей службы имен.
Unix
- Да
- Обработчик прерываний
- Нет
- Обработчик сигналов
- Нет
- В потоке
- Да
struct hostent, gethostbyaddr(), gethostbyname(), gethostbyname_r(), inet_ntop(), inet_pton()
/etc/hosts, /etc/nsswitch.conf в Справочнике по Утилитам
Предыдущий раздел: Описание API сетевой библиотеки