Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
95
Добавлен:
23.02.2015
Размер:
8.9 Mб
Скачать

Лекция 5. Программный интерфейс сокетов

Для доступа приложений к протоколам ТСР и UDPиспользуется прогаммный интерфейс сокетов. Интерфейс содержит около 20 процедур-функций, из которых рассмотрим 9 базовых. Данный раздел не преследует цель научить корректному программированию интерфейса, а предназначен для лучшего понимания взаимодействия программных и аппаратных средств протокола ТСР. По этой причине некоторые подробности описания функций пропущены.

Процедуры позволяют создать ТСР-соединение, передавать-принимать по нему данные, разорвать соединение. Каждая процедура имеет ряд входных и выходных аргументов. Входные аргументы необходимо указать в скобках при обращении к функции, выходной – после завершения работы процедуры будет присвоен самой функции. Среди выходных аргументов есть и коды возврата:

>= 0 – корректное завершение функции, выдача результата;

< 0 – ошибка завершения функции.

Рассмотрим вариант взаимодействия, при котором инициатор ТСР-соединения (“клиент”) устанавливает соединение с пассивной стороной (“сервером”), после чего обменивается с ним данными.

Описание функций программного интерфейса сокетов

socket (адресное семейство,тип,протокол) – получение номера сокета (целое >0) на локальной машине. Здесь

адресное семейство– указатель способа интерпретации адресов. ДляTCP/IP необходи-мо использовать параметрAF_INET;

тип – тип создаваемого сокета:SOCK_STREAMдля протокола ТСР илиSOCK_DGRAMдля передачи датаграмм по протоколуUDP;

протокол– определяется типом сокета, для ТСР необходимо использовать число 0.

Возвращенное значение socketназывается еще дескриптором сокета. Для удобства использования дескриптора возвращенное значение функции можно присвоить другой переменной, напримерs1:s1 =socket(...).

Функция socketлишь создает дескриптор, но не связывает его с конкретнымIP-адресом и номером порта. Для связывания есть функцииbindиconnect.

closesocket (сокет) – удаление указанного ненужного сокета и освобождение занятых им ресурсов. Здесь

сокет– дескриптор сокета.

bind (сокет,адрес сокета) – привязка указанного сокета к определенномуIP-адресу и номеру порта на локальной машине. Здесь

сокет– дескриптор, полученный с помощью функцииsocket;

адрес сокета – указатель на структуру, которая дляTCP/IPимеет вид

0 15 16 31

2

Номер порта (16 бит)

IP-адрес (32 бита)

При успешном выполнении утилиты ей возвращается число 0. Выполняется обычно на сервере, т.к. для него заранее известен номер порта, связанного с конкретным приложением сервера.

connect (сокет,адрес сокета) – запрос соединения с удаленным сервером. Здесь

сокет– дескриптор сокета, полученный на клиентской машине с помощью функцииsocket;

адрес сокета– указатель на структуру, аналогичную для функцииbind. В этой структуре должны быть указаны номер порта иIP-адресудаленногосервера.

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

В дальнейшем, тот же дескриптор сокета клиент будет использовать в утилитахsend(...) иreseive(...) при обмене данными с удаленным сервером.

listen(сокет,n) – прослушивание на сервере порта и создание очереди для приема запросов соединения клиентов. Здесь

сокет– дескриптор сокета, полученный на сервере с помощью функцииsocket;

n– длина очереди (n= > 1), т.е. максимальное число принимаемых соединений.

При успешном выполнении утилиты ей возвращается число 0.

accept(сокет,адрес сокета) – установление соединения с клиентом, запрос которого поступил в очередь на сервере. Здесь

сокет– дескриптор сокета, полученный на сервере с помощью функцииsocket;

адрес сокета– указатель на структуру, аналогичную для функцииbind.

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

Для удобства использования возвращенного дескриптора сокета клиента значение функ-ции можно присвоить другой переменной, например s2:s2 =accept(...). В дальнейшем, дескрипторs2 сервер будет использовать в утилитахsend(...) иreseive(...) при обмене данными с удаленным клиентом.

send(сокет,адрес буфера,b,флаги) – передача данных сервера вTCP-канал после установления ТСР-соединения с клиентом. Здесь

сокет– дескрипторs2 сокета (см. утилитуaccept);

адрес буфера– адрес буфера с данными для передачи их в канал ТСР. Буфер создается приложением;

b– количество байт в буфере;

флаги– указатели срочности данных и т.д. При обычной передаче в это поле записы-вается число 0.

При успешном выполнении утилиты целой переменной sendвозвращается число фактически переданных байтов.

send(сокет,адрес буфера,b,флаги) – передача данных клиента вTCP-канал после установления ТСР-соединения с сервером. Здесь

сокет– дескрипторs1 сокета (см. утилитуsocket).

Остальные параметры те же, что и в предыдущей команде send.

receive (сокет,адрес буфера,b,флаги) – прием данных сервером изTCP-канала после установления ТСР-соединения с клиентом. Здесь

сокет– дескрипторs2 сокета (см. утилитуaccept);

адрес буфера– адрес буфера, в который будут приниматься данные. Буфер создается приложением;

b– размер буфера (в байтах);

флаги– указатели срочности данных и т.д. При обычном приеме в это поле записы-вается число 0.

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

receive (сокет,адрес буфера,b,флаги) – прием данных клиентом изTCP-канала после установления ТСР-соединения с сервером. Здесь

сокет– дескрипторs1 сокета (см. утилитуsocket).

Остальные параметры те же, что и в предыдущей команде receive.

close(сокет) – запрос на закрытиеTCP-соединения после завершения сеанса передачи данных. Здесь

сокет- дескрипторs1 сокета (см. утилитуsocket) при выдаче команды на клиенте;

сокет- дескрипторs2 сокета (см. утилитуaccept) при выдаче команды на сервере.

Схема использования процедур при взаимодействии

клиента с сервером

Клиент Сервер Пояснения

socket (...)socket (...) Фаза

bind (...) подготовки

listen(...) к соединению

accept(...) Ожидание поступления запросов от клиентов

connect (...) Фаза установления

ТСР-соединения (обмен тремя сегментами).

Состояние ТСР-соединения: Established

send(...)receive (...) Фаза

receive (...) send (...) обмена

. . . . . . данными

close(...)close(...) Фаза разъединения (обмен четырьмя сегментами)

Соседние файлы в папке Сетевые технологии