#include <netdb.h> extern int h_errno; struct hostent *gethostbyname(const char *name); #include <sys/socket.h> /* for AF_INET */ struct hostent *gethostbyaddr(const char *addr, int len, int type); void sethostent(int stayopen); void endhostent(void); void herror(const char *s); const char *hstrerror(int err); /* GNU extensions */
struct hostent *gethostbyname2(const char *name, int af); int gethostbyname_r (const char *name, struct hostent *ret, char *buf, size_t buflen, struct hostent **result, int *h_errnop); int gethostbyname2_r (const char *name, int af, struct hostent *ret, char *buf, size_t buflen, struct hostent **result, int *h_errnop);
Функция gethostbyaddr() возвращает структуру типа hostent указанному адресу машины addr, длина которого равна len, а тип адреса равен type. В данный момент типом адреса может быть только AF_INET.
Функция sethostent() (если значение stayopen истинно (1)) указывает, что соединенный сокет TCP должен быть использован для отправки запросов серверу имен, а также то, что соединение должно оставаться открытым во время последующих запросов. В противном случае для отправки серверу имен запросов будут использоваться датаграммы UDP.
Функция endhostent() закрывает соединение TCP для запроса сервера имен.
Функция error() (устаревшая) выводит сообщение об ошибке, связанное с текущим значением h_errno в стандартном потоке вывода ошибок.
Функция hstrerror() (устаревшая) в качестве параметра использует номер ошибки (обычно h_errno) и возвращает соответствующую строку сообщения.
Запросы имени домена, производимые функциями gethostbyname() и gethostbyaddr(), используют комбинацию данных любых или всех серверов имен named(8), записи из файла /etc/hosts и комбинацию данных сетевой информационной службы (NIS или YP) в зависимости от порядка строк файла /etc/host.conf (см. resolv+(8). По умолчанию производится опрос named (8), затем /etc/hosts.
Структура hostent определена в <netdb.h> следующим образом:
struct hostent { char *h_name; /* официальное имя машины */ char **h_aliases; /* список псевдонимов */ int h_addrtype; /* тип адреса машины */ int h_length; /* длина адреса */ char **h_addr_list; /* список адресов */ } #define h_addr h_addr_list[0] /* для совместимости с предыдущими версиями */
Полями структуры hostent являются:
Функции gethostbyname() и gethostbyaddr() могут возвращать указатели на статические данные, которые могут быть перезаписаны более поздними вызовами. Простого копирования структуры struct hostent недостаточно, так как эта структура содержит указатели - небоходимо глубокое копирование.
В glibc2 имеется также функция gethostbyname2() работающая как gethostbyname(), но позволяющая обозначать семейство, к которому должен принадлежать адрес.
Кроме того, glibc2 содержит реентрантные версии gethostbyname_r() и gethostbyname2_r(). Эти функции возвращают 0 при успешном завершении и ненулевое значение при ошибке. Результат вызова заносится в структуру с адресом ret. После вызова *result может быть NULL при ошибке или указывать на результат при успешном завершении. Вспомогательные данные заносятся в буфер buf длиной buflen. (Если буфер слишком мал, то функция вернет ERANGE.) Глобальная переменная h_errno не изменяется, но в h_errnop передается адрес переменной, в которую будет занесен код ошибки.
POSIX 1003.1-2001 заменяет gethostbyaddr() на gethostbyname().
struct hostent *getipnodebyaddr(const void *restrict addr, socklen_t len, int type, int *restrict error_num); struct hostent *getipnodebyname(const char *name, int type, int flags, int *error_num);
Закладки на сайте Проследить за страницей |
Created 1996-2024 by Maxim Chirkov Добавить, Поддержать, Вебмастеру |