ВУЗ:
Составители:
48
которые возвращает gethostbyname определен код ERANGE. В этом случае вызов
функции должен быть повторен с большим буфером. Дополнительная информация об
ошибке хранится не в глобальной переменной errno, а в структуре, на которую
указывает H_ERRNOP.
struct hostent *gethostname (char *host)
{
struct hostent hostbuf, *hp;
size_t hstbuflen;
char *tmphstbuf;
int res;
int herr;
hstbuflen = 1024;
tmphstbuf = malloc (hstbuflen);
while ((res = gethostbyname_r (host, &hostbuf, tmphstbuf,
hstbuflen, &hp, &herr)) == ERANGE)
{
/* Enlarge the buffer. */
hstbuflen *= 2;
tmphstbuf = realloc (tmphstbuf, hstbuflen);
}
/* Check for errors. */
if (res || hp == NULL)
return NULL;
return hp->h_name;
}
int gethostbyname2_r (const char *NAME,
int AF,
struct hostent *restrict RESULT_BUF,
char *restrict BUF,
size_t BUFLEN,
struct hostent **restrict RESULT,
int *restrict H_ERRNOP)
Эта функция идентична gethostbyname_r, кроме того, что позволяет указывать
тип адреса в аргументе AF.
int gethostbyaddr_r (const char *ADDR,
int LENGTH,
int FORMAT,
struct hostent *restrict RESULT_BUF,
char *restrict BUF,
size_t BUFLEN,
struct hostent **restrict RESULT,
int *restrict H_ERRNOP)
Функция возвращает информацию о хосте с интернет-адресом ADDR.
Параметр ADDR в действительности не является указателем на char – он может быть
указателем на адрес типа IPv4 или IPv6. Аргумент LENGTH задает длину адреса в
ADDR. FORMAT указывает тип адреса. Как и при вызове функции gethostbyname_r
необходимо выделить буфер для результата и область памяти, используемую функцией.
В случае успеха функция возвращает 0, в противном случае – код ошибки.
С помощью следующих функций можно просканировать всю базу данных
хостов, последовательно выбирая по одной записи. Эти функции не являются повторно
входимыми.
void sethostent (int STAYOPEN)
Функция открывает базу данных хостов для сканирования. Если параметр
STAYOPEN не равен нулю, устанавливается флаг, который указывает, что вызовы
которые возвращает gethostbyname определен код ERANGE. В этом случае вызов функции должен быть повторен с большим буфером. Дополнительная информация об ошибке хранится не в глобальной переменной errno, а в структуре, на которую указывает H_ERRNOP. struct hostent *gethostname (char *host) { struct hostent hostbuf, *hp; size_t hstbuflen; char *tmphstbuf; int res; int herr; hstbuflen = 1024; tmphstbuf = malloc (hstbuflen); while ((res = gethostbyname_r (host, &hostbuf, tmphstbuf, hstbuflen, &hp, &herr)) == ERANGE) { /* Enlarge the buffer. */ hstbuflen *= 2; tmphstbuf = realloc (tmphstbuf, hstbuflen); } /* Check for errors. */ if (res || hp == NULL) return NULL; return hp->h_name; } int gethostbyname2_r (const char *NAME, int AF, struct hostent *restrict RESULT_BUF, char *restrict BUF, size_t BUFLEN, struct hostent **restrict RESULT, int *restrict H_ERRNOP) Эта функция идентична gethostbyname_r, кроме того, что позволяет указывать тип адреса в аргументе AF. int gethostbyaddr_r (const char *ADDR, int LENGTH, int FORMAT, struct hostent *restrict RESULT_BUF, char *restrict BUF, size_t BUFLEN, struct hostent **restrict RESULT, int *restrict H_ERRNOP) Функция возвращает информацию о хосте с интернет-адресом ADDR. Параметр ADDR в действительности не является указателем на char – он может быть указателем на адрес типа IPv4 или IPv6. Аргумент LENGTH задает длину адреса в ADDR. FORMAT указывает тип адреса. Как и при вызове функции gethostbyname_r необходимо выделить буфер для результата и область памяти, используемую функцией. В случае успеха функция возвращает 0, в противном случае – код ошибки. С помощью следующих функций можно просканировать всю базу данных хостов, последовательно выбирая по одной записи. Эти функции не являются повторно входимыми. void sethostent (int STAYOPEN) Функция открывает базу данных хостов для сканирования. Если параметр STAYOPEN не равен нулю, устанавливается флаг, который указывает, что вызовы 48
Страницы
- « первая
- ‹ предыдущая
- …
- 46
- 47
- 48
- 49
- 50
- …
- следующая ›
- последняя »