Лекции по курсу "Системное программирование для UNIX". Литвинов Д.Г. - 47 стр.

UptoLike

Составители: 

47
Эта структура данных используется для представления записи в базе данных
хостов. Структура имеет следующие поля:
h_name “официальноеимя хоста;
h_aliases альтернативные имена хоста, определенные как вектор строк,
заканчивающихся нулем;
h_addrtype тип адреса хоста. Может содержать значения AF_INET и AF_INET6;
h_length длина в байтах каждого адреса;
h_addr_list вектор адресов хоста (хост может быть подключен к нескольким сетям,
для каждой из которых он может иметь уникальный адрес). Вектор
заканчивается нулевым указателем;
h_addr синоним для h_addr_list[0].
Следующие функции предназначены для поиска в базе данных хостов.
Результат поиска возвращается в размещенном статически блоке памяти.
struct hostent * gethostbyname (const char *NAME)
Функция возвращает информацию о хосте NAME. Если такой хост не найден,
возвращается нулевой указатель.
struct hostent * gethostbyname2 (const char *NAME, int AF)
Эта функция идентична gethostbyname кроме того, что позволяет указать тип
возвращаемого адреса.
struct hostent * gethostbyaddr (const char *ADDR, int LENGTH,
int FORMAT)
Возвращает информацию о хосте с интернет-адресом ADDR. В действительно
ADDR может не быть указателем на char, это может быть указатель на адрес как в
стандарте IPv4, так и IPv6. Аргумент LENGTH задает длину адреса, задаваемого в
ADDR. FORMAT указывает формат адреса. Если хост с таким адресом не найден,
функция возвращает нулевой указатель.
Если поиск с использованием функций gethostbyname и gethostbyaddr
завершился с ошибкой, переменная errno может принимать следующие значения:
HOST_NOT_FOUND Хост не найден в базе данных.
TRY_AGAIN Соединение с сервером имен не было установлено. При
повторной попытке поиска функция может выполниться
успешно.
NO_RECOVERY Произошла фатальная ошибка.
NO_ADDRESS База данных содержит запись для задаваемого имени хоста, но
отсутствует соответствующий адрес.
Рассмотренные выше функции не являются повторно входимыми и,
соответственно, не могут использоваться в многопотоковых приложениях. В этом
контексте могут использоваться следующие функции, определенные в Linux.
int gethostbyname_r (const char *restrict NAME,
struct hostent *restrict RESULT_BUF,
char *restrict BUF,
size_t BUFLEN,
struct hostent **restrict RESULT,
int *restrict H_ERRNOP)
Функция возвращает информацию о хосте NAME. При вызове функции
необходимо передать указатель на буфер результата в параметре RESULT_BUF.
Функция также может понадобиться дополнительное пространство памяти, указатель на
которое и длина буфера передаются в параметрах BUF и BUFLEN.
Указатель на буфер, в котором хранится результат, помещается в RESULT.
Если произошла ошибка или запись не была найдена, RESULT возвращает нулевой
указатель. Функция выполнилась успешно, если ее возвращаемое значение равно 0, в
противном случае возвращаемое значение равно коду ошибки. В дополнение к кодам,
         Эта структура данных используется для представления записи в базе данных
хостов. Структура имеет следующие поля:
h_name         “официальное” имя хоста;
h_aliases      альтернативные имена хоста, определенные как вектор строк,
               заканчивающихся нулем;
h_addrtype     тип адреса хоста. Может содержать значения AF_INET и AF_INET6;
h_length       длина в байтах каждого адреса;
h_addr_list    вектор адресов хоста (хост может быть подключен к нескольким сетям,
               для каждой из которых он может иметь уникальный адрес). Вектор
               заканчивается нулевым указателем;
h_addr         синоним для h_addr_list[0].
         Следующие функции предназначены для поиска в базе данных хостов.
Результат поиска возвращается в размещенном статически блоке памяти.
       struct hostent * gethostbyname (const char *NAME)
       Функция возвращает информацию о хосте NAME. Если такой хост не найден,
возвращается нулевой указатель.
       struct hostent * gethostbyname2 (const char *NAME, int AF)
       Эта функция идентична gethostbyname кроме того, что позволяет указать тип
возвращаемого адреса.
       struct hostent * gethostbyaddr (const char *ADDR, int LENGTH,
            int FORMAT)
        Возвращает информацию о хосте с интернет-адресом ADDR. В действительно
ADDR может не быть указателем на char, это может быть указатель на адрес как в
стандарте IPv4, так и IPv6. Аргумент LENGTH задает длину адреса, задаваемого в
ADDR. FORMAT указывает формат адреса. Если хост с таким адресом не найден,
функция возвращает нулевой указатель.
        Если поиск с использованием функций gethostbyname и gethostbyaddr
завершился с ошибкой, переменная errno может принимать следующие значения:
HOST_NOT_FOUND          Хост не найден в базе данных.
TRY_AGAIN               Соединение с сервером имен не было установлено. При
                        повторной попытке поиска функция может выполниться
                        успешно.
NO_RECOVERY             Произошла фатальная ошибка.
NO_ADDRESS              База данных содержит запись для задаваемого имени хоста, но
                        отсутствует соответствующий адрес.
        Рассмотренные выше функции не являются повторно входимыми и,
соответственно, не могут использоваться в многопотоковых приложениях. В этом
контексте могут использоваться следующие функции, определенные в Linux.
       int gethostbyname_r (const char *restrict NAME,
       struct hostent *restrict RESULT_BUF,
       char *restrict BUF,
       size_t BUFLEN,
       struct hostent **restrict RESULT,
       int *restrict H_ERRNOP)
        Функция возвращает информацию о хосте NAME. При вызове функции
необходимо передать указатель на буфер результата в параметре RESULT_BUF.
Функция также может понадобиться дополнительное пространство памяти, указатель на
которое и длина буфера передаются в параметрах BUF и BUFLEN.
        Указатель на буфер, в котором хранится результат, помещается в RESULT.
Если произошла ошибка или запись не была найдена, RESULT возвращает нулевой
указатель. Функция выполнилась успешно, если ее возвращаемое значение равно 0, в
противном случае возвращаемое значение равно коду ошибки. В дополнение к кодам,


                                                                                47