Основные системные вызовы в API-интерфейсе сокетов

Вызовы сокетов можно разделить на две группы: основные вызовы, которые предоставляют доступ к базовым функциональным средствам, и вспомогательные процедуры, которые упрощают работу программиста. В настоящем разделе описаны вызовы, которые предоставляют основные функциональные средства, необходимые для работы клиентов и серверов.

Объем информации, связанный с описанием системных вызовов сокетов, их параметров и семантики, может показаться ошеломляющим. Сложность этого интерфейса в основном связана с тем, что сокеты имеют параметры, позволяющие использовать их в программах многими способами. Сокет может применяться клиентом или сервером для потоковой передачи (TCP) или дейтаграммной связи (UDP), причем он может использоваться с конкретным адресом удаленной оконечной точки (обычно необходимым для клиента) или с неопределенным адресом удаленной оконечной точки (обычно необходимым для сервера).

Чтобы упростить задачу освоения интерфейса сокетов, начнем с изучения основных вызовов сокетов и описания того, как они могут использоваться в простых клиентских и серверных программах для обмена данными с помощью протокола TCP. В каждой из следующих глав рассматривается один из способов использования сокетов и иллюстрируются многие подробности и тонкости, не описанные в настоящей главе.

5.7.1. Вызов функции socket

В приложении функция socket вызывается для создания нового сокета, который может использоваться для сетевой связи. После вызова эта функция возвращает дескриптор вновь созданного сокета. Параметры вызова обозначают семейство протоколов, которое будет применяться в приложении (например, PF_I$ET для TCP/IP), и необходимый протокол или тип службы (например, потоковый или дейтаграммный). Для сокета, в котором используется семейство протоколов Internet, параметр с указанием протокола или типа службы определяет, какой протокол (TCP или UDP) будет применяться в сокете.

5.7.2. Вызов функции connect

После создания сокета клиент вызывает функцию connect для установления активного соединения с удаленным сервером. Параметр функции connect, который включает IP-адрес удаленного компьютера и номер порта протокола, позволяет клиенту указать удаленную оконечную точку. После установления соединения клиент может передавать с его помощью данные.

5.7.3. Вызов функции send

Функция send используется и в клиентах, и в серверах для передачи данных через соединение TCP. Клиенты обычно используют функцию send для передачи запросов, а серверы — для передачи ответов. При вызове функции send необходимо задать три параметра. Приложение передает системе в этом вызове дескриптор сокета, в который должны быть отправлены данные, адрес передаваемых данных и их длину. Обычно функция send копирует исходящие данные в буферы, находящиеся в ядре операционной системы, и позволяет приложению продолжать выполнение, в то время как происходит передача данных по сети. Если буферы системы переполняются, вызов функции send может быть временно заблокирован, т.е. до тех пор, пока не появится возможность передать по протоколу TCP данные по сети и освободить в буфере место для новых данных. Отличный интернет магазин мужской одежды Стальные двери герда заказать входную дверь. .

5.7.4. Вызов функции recv

И клиенты, и серверы используют функцию recv для приема данных из соединения TCP. Обычно после установления соединения сервер использует функцию recv для получения запроса, отправляемого клиентом путем вызова функции send. После отправки запроса клиент использует функцию recv для получения ответа.

Для чтения данных из соединения приложение вызывает функцию recv с тремя параметрами. Первый параметр задает используемый дескриптор сокета, второй определяет адрес буфера, а третий указывает длину буфера. Функция recv извлекает байты данных, поступающие через сокет, и копирует их в область буфера, определяемую пользователем. Если данные не поступают, вызов функции recv блокируется до тех пор, пока они не начнут поступать. Если поступает больше данных, чем помещается в буфере, функция recv извлекает из сокета только тот объем, который является достаточным для заполнения буфера. Если поступает меньше данных, чем помещается в буфере, функция recv извлекает все данные и возвращает число полученных байтов.

В клиентах и серверах функция recv может также использоваться для получения сообщений из сокетов, в которых применяется протокол UDP. Как и при использовании протокола с установлением логического соединения, в вызывающем операторе должно быть задано три параметра, которые обозначают дескриптор сокета, адрес буфера для размещения данных и размер буфера. При каждом вызове функции recv извлекается одно входящее сообщение UDP (т.е. одна пользовательская дейтаграмма). Если буфер не может вместить полностью все сообщение, функция recv заполняет буфер и отбрасывает оставшиеся данные.

5.7.5. Вызов функции close

После завершения использования сокета в клиентской или серверной программе необходимо вызвать функцию close для его освобождения. Если сокет используется только одним процессом, функция close немедленно разрывает соединение и освобождает сокет, а если сокет находится в совместном использовании нескольких процессов, функция close уменьшает число ссылок на сокет и освобождает его, как только число ссылок достигает нуля.

5.7.6. Вызов функции bind

Сразу после создания сокета в нем отсутствует информация об адресах оконечных точек (ему не присвоен ни локальный, ни удаленный адрес). В приложении для указания адреса локальной оконечной точки вызывается функция bind. Этот вызов принимает параметры, в которых задаются дескриптор сокета и адрес оконечной точки. В протоколах TCP/IP для задания адреса оконечной точки используется структура sockaddr_in, которая включает и IP-адрес, и номер порта протокола. В сервере функция bind используется в основном для указания общепринятого номера порта, через который он будет принимать запросы на установление соединения.

5.7.7. Вызов функции listen

Сразу после создания сокет не является ни активным (т.е. готовым для использования клиентом), ни пассивным (т.е. готовым для использования сервером) до тех пор, пока в приложении не будут осуществлены дальнейшие действия. Серверы с установлением логического соединения вызывают функцию listen, чтобы перевести сокет в пассивный режим и подготовить его для приема входящих запросов на установление соединения.
Большая часть серверных программ состоит из бесконечного цикла, в котором принимается очередной входящий запрос на установление соединения, выполняется его обработка, а затем происходит возврат к выполнению операции приема очередного входящего соединения. Даже если обработка каждого входящего соединения занимает только несколько миллисекунд, может оказаться, что новый запрос на установление соединения поступит в тот момент, когда сервер занимается обработкой текущего запроса. Для обеспечения того, чтобы не был потерян ни один запрос на установление соединения, сервер должен передать функции listen параметр, который указывает операционной системе, что запросы на установление соединения, поступающие в сокет, нужно ставить в очередь. Поэтому один параметр вызова функции listen указывает сокет, который должен быть переведен в пассивный режим, а другой — размер очереди, предназначенной для этого сокета.

5.7.8. Вызов функции accept

При работе с сокетами TCP после вызова в серверной программе функций socket (для создания сокета), bind (для указания адреса локальной оконечной точки) и listen (для перевода сокета в пассивный режим) вызывается функция accept для извлечения из очереди следующего входящего запроса на установление соединения. Параметр функции accept указывает сокет, из очереди которого должен быть принят запрос на соединение.
Функция accept создает новый сокет для каждого нового запроса на соединение и возвращает дескриптор нового сокета в вызывающий оператор. В сервере новый сокет используется только для нового соединения, а первоначальный сокет служит для приема следующих запросов на соединение. Сразу после приема запроса на соединение сервер может передавать данные через новый сокет. Закончив использование нового сокета, сервер его закрывает.

5.7.9. Применение функций read и write с сокетами

В системе Linux, как и в большинстве других систем UNIX, программисты могут использовать функцию read вместо recv, и write вместо send. Это означает, что применительно к сокетам TCP или UDP функция read имеет тот же смысл, что и recv, а функция write равнозначна send. Основным преимуществом использования функций read и write является то, что программисты с ними уже знакомы, а основным преимуществом функций send и recv можно назвать то, что их можно легко отличить от других функций ввода/вывода в коде.

5.7.10. Сводные данные по вызовам функций сокетов

В табл. 5.1 перечислены системные вызовы, относящиеся к сокетам.

Таблица 5.1. Функции сокета и их назначение; функции read и write эквивалентны функциям recv и send

Функция Назначение socket Создать дескриптор для использования в сетевой связи connect Подключиться к удаленному участнику соединения (клиент) send (write) Передать исходящие данные в соединение TCP recv (read) Принять входящие данные из соединения TCP close Завершить связь и освободить дескриптор bind Привязать локальные IP-адрес и порт протокола к сокету listen Перевести сокет в пассивный режим и установить число входящих запросов на установление соединения TCP, которые должны быть поставлены в очередь операционной системой (сервер) accept Принять очередной входящий запрос на соединение (сервер) recv (read) Принять следующую входящую дейтаграмму UDP recvmsg Принять следующую входящую дейтаграмму UDP (разновидность функции recv) recvfrom Принять следующую входящую дейтаграмму и записать исходный адрес ее оконечной точки send (write) Пёредать исходящую дейтаграмму UDP sendmsg Передать исходящую дейтаграмму UDP (разновидность функции send) sendto Передать исходящую дейтаграмму UDP, обычно по заранее записанному ад­ресу оконечной точки shutdown Завершить передачу данных через соединение TCP в одном или обоих на­правлениях getpeername После поступления запроса на установление соединения получить адрес око­нечной точки удаленного компьютера из сокета getsockopt Получить текущие опции сокета setsockopt Изменить опции сокета Похожие статьи Меню Опрос Фото Популярное