Аллен Питер В.
Шрифт:
Вызов listen «заставляет» программу-сервер работать в режиме ожидания запроса на соединение от клиента. Прототип этой функции следующий:
Первый параметр — это дескриптор сокета, а второй — максимальное количество запросов на установление связи (другими словами, максимальное количество клиентов).
Как и функция bind, функция listen в случае успеха возвращает 0. Пример вызова функции:
Используется программой-клиентом для отправки запроса на подключение к серверу. Прототип функции следующий:
Первый параметр — это дескриптор сокета, созданного функцией socket и привязанного функцией bind. Привязку сокета функцией bind выполнять не обязательно: если сокет не был привязан до вызова connect, привязка будет выполнена автоматически.
Второй параметр — это указатель на структуру типа sockaddr_in, содержащую информацию о сервере: его IP-адрес, номер порта, а также семейство протоколов.
Последний параметр — это размер структуры sockaddr_in в байтах. В случае успеха функция возвращает 0, а в случае ошибки —1.
Вот пример использования вызова connect:
Если вы используете режим без установления соединения (SOCK_DGRAM), вызов connect необязателен.
Если максимальное число клиентов не превышено, сервер может принять запрос клиента. Для этого используется функция accept. Данная функция используется только при работе в режиме с установлением соединения. Прототип функции следующий:
Первый параметр — это дескриптор сокета, второй — указатель на структуру, где можно разместить адрес клиента, причем данную структуру инициализировать не нужно. Последний параметр — размер структуры, указанной во втором параметре.
Системный вызов accept работает так. Сначала он извлекает из очереди listen запрос на соединение и создает новый сокет, через который будет производиться обмен данными с клиентом, например:
Если вызов accept завершился успехом, структура addr, задаваемая во втором параметре, будет содержать IP-адрес клиента.
Если очередь listen пуста, то наш сервер будет ожидать появления нового клиента. В случае ошибки функция accept возвращает отрицательное значение.
27.3.4. Функция gethostbyname
Пользователям обычно удобнее указать символьное имя сервера, чем его IP-адрес. Для разрешения имени служит функция gethostbyname. Вот ее прототип:
Данная функция возвращает указатель на структуру типа hostent, содержащую следующие поля:
♦ char *h_name — доменное имя узла;