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

UptoLike

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

49
gethostbyname и gethostbyaddr не будут закрывать базу данных (что обычно
происходит).
struct hostent * gethostent (void)
Возвращает следующую запись из базы данных хостов. Если предыдущая
запись была последней, возвращается нулевой указатель.
void endhostent (void)
Эта функция закрывает базу данных.
Интернет-порты
Номер порта в пространстве имен определяет гнездо на конкретной машине.
Порты могут иметь номера от 0 до 65535. Номера портов, меньшие, чем
IPPORT_RESERVED зарезервированы для стандартных серверов таких, как finger и
telnet. Существует база данных, которая хранит значения зарезервированных портов.
Для получения сервисов, закрепленных за портами можно использовать функцию
getservbyname.
При разработке сервера, который не относится к стандартным серверам,
определенным в базе данных, для него необходимо выбрать номер порта. Для этого
используются порты, значения которых превышают IPPORT_USERRESERVED. Эти
порты зарезервированы для серверов и не могут генерироваться операционной
системой. При использовании гнезда без указания его адреса операционная система
генерирует номер порта. Этот номер выбирается из диапазона IPPORT_RESERVED -
IPPORT_USERRESERVED.
В адресном пространстве интернет допустимо использование двух различных
гнезд, имеющих один и тот же номер, но только в том случае, если они не предпримут
попытку взаимодействовать с тем же адресом гнезда (включающим адрес хоста и номер
порта). Обычно необходимости в дублировании номера порта нет за исключением
случаев, когда этого требует высокоуровневый сетевой протокол. В этом случае гнездо
необходимо создавать с использованием опции SO_REUSEADDR.
База данных сервисов
База данных, которая хранит информацию о сервисах обычно расположена в
файле ‘/etc/services’ или на сервере имен. С помощью следующих структур и функций,
определенных в заголовочном файле <netdb.h> можно получить доступ к этой базе
данных.
struct servent {
char *s_name;
char **s_aliases;
int s_port;
char *s_proto;
};
s_name имя сервиса;
s_aliases альтернативные имена сервиса. Задаются в виде массива строк.
Массив завершается нулевым указателем;
s_port номер порта сервиса;
s_proto имя протокола, используемого с сервисом.
struct servent * getservbyname (const char *NAME,
const char *PROTO)
Функция возвращает информацию о сервисе, называющемся NAME и
использующего протокол PROTO. Если сервис не найден, возвращается нулевой
указатель. Функция может использоваться как для серверов, так и для клиентов;
серверы могут использовать ее для определения того, какой порт следует
прослушивать.
gethostbyname и gethostbyaddr не будут закрывать базу данных (что обычно
происходит).
          struct hostent * gethostent (void)
        Возвращает следующую запись из базы данных хостов. Если предыдущая
запись была последней, возвращается нулевой указатель.
          void endhostent (void)
          Эта функция закрывает базу данных.

         Интернет-порты
         Номер порта в пространстве имен определяет гнездо на конкретной машине.
Порты могут иметь номера от 0 до 65535. Номера портов, меньшие, чем
IPPORT_RESERVED зарезервированы для стандартных серверов таких, как finger и
telnet. Существует база данных, которая хранит значения зарезервированных портов.
Для получения сервисов, закрепленных за портами можно использовать функцию
getservbyname.
         При разработке сервера, который не относится к стандартным серверам,
определенным в базе данных, для него необходимо выбрать номер порта. Для этого
используются порты, значения которых превышают IPPORT_USERRESERVED. Эти
порты зарезервированы для серверов и не могут генерироваться операционной
системой. При использовании гнезда без указания его адреса операционная система
генерирует номер порта. Этот номер выбирается из диапазона IPPORT_RESERVED -
IPPORT_USERRESERVED.
         В адресном пространстве интернет допустимо использование двух различных
гнезд, имеющих один и тот же номер, но только в том случае, если они не предпримут
попытку взаимодействовать с тем же адресом гнезда (включающим адрес хоста и номер
порта). Обычно необходимости в дублировании номера порта нет за исключением
случаев, когда этого требует высокоуровневый сетевой протокол. В этом случае гнездо
необходимо создавать с использованием опции SO_REUSEADDR.

        База данных сервисов
        База данных, которая хранит информацию о сервисах обычно расположена в
файле ‘/etc/services’ или на сервере имен. С помощью следующих структур и функций,
определенных в заголовочном файле  можно получить доступ к этой базе
данных.
          struct servent {
               char *s_name;
               char **s_aliases;
               int s_port;
               char *s_proto;
          };
s_name            имя сервиса;
s_aliases         альтернативные имена сервиса. Задаются в виде массива строк.
                  Массив завершается нулевым указателем;
s_port            номер порта сервиса;
s_proto           имя протокола, используемого с сервисом.
          struct servent * getservbyname (const char *NAME,
               const char *PROTO)
        Функция возвращает информацию о сервисе, называющемся NAME и
использующего протокол PROTO. Если сервис не найден, возвращается нулевой
указатель. Функция может использоваться как для серверов, так и для клиентов;
серверы могут использовать ее для определения того, какой порт следует
прослушивать.


                                                                                49