Файл: Очная 2016 г Содержание.doc

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 04.12.2023

Просмотров: 193

Скачиваний: 1

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.


Каким образом клиент указывает местонахождение сервера? В Интернете это местонахождение обозначается парой идентификаторов (computer, application)

Здесь computer обозначает компьютер, на котором выполняется серверная про­грамма, а applicationконкретную прикладную программу на этом компьютере. При передаче по Интернету эти два значения представлены в виде двоичных чисел. Однако сами пользователи не имеют дела с двоичным представлением — они указывают нужные значения в символьном виде. Пользователи вводят имена и числа, а сетевое программное обеспечение вызывает на выполнение функции, преобразующие символьные значения в соответствующие двоичные значения автоматически.

Принципы обмена данными


В процессе обмена данными между большинством приложений Интернета выполняется одна и та же последовательность операций.

  • Вначале запускается на выполнение серверное приложение и ожидает за­проса на установление соединения от клиента.

  • Клиент обращается к серверу, указывая его местонахождение и передавая требование приступить к обмену данными.

  • Клиент и сервер обмениваются сообщениями.

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

Рассматриваемая библиотека содержит функции, которые обеспечивают вы­полнение каждого из этих этапов.

7. Функциональная логика приложений



До сих пор мы обсуждали взаимодействие между двумя приложениями на концептуальном уровне, а теперь подробно рассмотрим конкретную реализацию. Специалисты по вычислительной технике используют термин интерфейс при­кладного программирования (АРI — Application Program Interface) для описания набора операций, имеющихся в распоряжении программиста. API-интерфейс определяет параметры, а также смысл каждой операции.

Для демонстрации принципов сетевого программирования мы разработали простой АРI-интерфейс для операций обмена данными по сети. После описания АРI-интерфейса рассмотрим приложения; в которых он используется. В Таблица 1 пере­числено семь функций, которые могут быть вызваны в приложении.
Таблица 1 Пример АРI-интерфейса включает семь операций. Этих семи функций достаточно для создания большинства сетевых приложений1.

Операция

Описание

await_contact

Используется сервером для перехода в режим ожидания запросе клиента на установление соединения

make_contact

Используется клиентом для передачи серверу запроса на установление соединения

cname_to_comp

Используется для преобразования имени компьютера в эквивалентное внутреннее двоичное значение

appname_to_appmun

Используется для преобразования имени программы в эквивалентное внутреннее двоичное значение

send

Используется клиентом или сервером для передачи данных

recv

Используется клиентом или сервером для передачи данных

send_eof

Используется клиентом и сервером после завершения передачи данных




Неформальное описание АРI-интерфейса


Сервер начинает свою работу с вызова функции Await_contact для перехода в режим ожидания запроса на установление соединения от клиента. Клиент на­чинает свою работу с вызова функции Make_contact для установления соединения.

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

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

Принцип действия этого АРI-Интерфейса можно пояснить на простейшем примере. Рассмотрим приложение, в котором клиент устанавлива­ет соединение с сервером, отправляет, единственный запрос и получает единственный ответ. На Рисунок 13 показана последовательность вызовов функций АРI-интерфейса, выполняемых клиентом и сервером при таком сеансе обмена данными.




Рисунок 13 – Последовательность вызовов функций АРI-интерфейса в простейшем сеансе обмена данными. Клиент посылает один запрос и получает один ответ.

Определение АРI-интерфейса


Чтобы АРI-интерфейс был независимым от конкретных операционных систем и сетевого программного обеспечения, для него определены три типа данных, которые используются во всем коде. В Таблица 2 перечислены имена типов и указано их назначение.
Таблица 2 Типы данных, применяемые в примере АР1-интерфейса. На конкретном компьютере эти типы могут быть определены как целые числа конкретного размера.

Имя типа

Описание

Appnum

Двоичное значение, которое используется в качестве идентификатора приложения

Computer

Двоичное значение, которое используется в качестве идентификатора компьютера

connection

Значение, которое используется в качестве идентификатора соединения между клиентом и сервером


С помощью трех типов данных, приведенных в табл. 3.2, можно точно определить АРI-интерфейс. Для каждой функции ниже приведены объявления в стиле языка С с указанием типа данных каждого параметра, а также типа данных, возвращаемого функцией.
Функция await_contact

Сервер вызывает функцию await_contact для перехода в режим ожидания запроса от клиента на установление соединения.

connection await_contact(аррnum а)

Этот вызов принимает один параметр типа аррnum и возвращает значение типа connection. Параметр задает число, которое обозначает серверное приложение в клиентской программе при передаче на сервер запроса на установление соединения должно быть указано то же число. Сервер использует возвращаемое значение (типа connection) для передачи данных.

Функция make_contact

Клиент вызывает функцию make_contact для установления соединения с сервером.

connection make_contact (computer с, appnum а)

Этот вызов принимает два параметра с обозначением компьютера, на котором работает сервер, и номера приложения, используемого сервером на этом компьютере. Клиент применяет возвращаемое значение типа connection передачи данных.

Функция аррname_to_аррnum

Клиент и сервер используют функцию аррname_to_аррnum для преобразования: имени службы, предназначенного для восприятия человеком, во внутреннее двоичное значение. Имена служб в Интернете стандартизированы (например, www означает службу World Wide Web).

аррnum_appname_to_appnum(char *a)

Этот вызов принимает один параметр строкового типа (в языке С объявление char * применяется для обозначения строки) и возвращает эквивалентное двоичное значение типа аррnum

Функция cname_to_comp

Клиенты могут вызывать функцию cname_to_comp для преобразования имени компьютера, которое предназначено для восприятия человеком, во внутренне двоичное значение.

computer_cname(char *с)

Этот вызов принимает один параметр строкового типа (char *) и возвращает эквивалентное двоичное значение типа computer.

Функция send

Клиент и сервер могут использовать функцию send для передачи данных по сети.

int send(connention con, char *buffer, int length, int flags)

Этот вызов принимает четыре параметра. Первый параметр обозначает соединение, установленное ранее с помощью функции make_contact или await_contact,
второй представляет собой адрес буфера, содержащего данные, предназначенные для передачи, третий параметр задает длину данных в байтах октетах), а четвертый при обычной передаче равен нулю. Функция send возвращает число переданных байтов или отрицательное значение, если возникла ошибка. См. также функцию send_eof, которая применяется для передачи признака конца файла после отправки всех данных.

Функции recv и recvln

И клиент, и сервер могут использовать, функцию геcv для доступа к данным,
поступающим по сети.

int recv( connection соn, char *buffer, int length, int flags)

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

В этом примере кода применяется также библиотечная функция recvln, которая повторно вызывает функцию recv до тех пор, пока не будет получена целая строка текста. Определение функции recvln приведено ниже;

int recvln( connection соn, char *buffer, int length)
Функция send_eof

И клиент, и сервер после отправки данных должны вызвать функцию send_eof для передачи второму участнику соединения сообщения о том, что пе­редача данных на этом закончена. На другом конце соединения функция геcv при получении признака конца файла возвращает значение ноль.

int send_еоf(сonnection сon)

Этот вызов принимает один параметр, который указывает соединение, ранее установленное с помощью функции await_contact или make_contact. Функция возвращает отрицательное значение для указания на то, что возникла ошибка; в ином случае — положительное значение или ноль.

Сводные данные по АРI-интерфейсу


В Таблица 3 приведены сводные данные по параметрам функции каждого типа, которые используются в этом примере АР1-интерфейса. В таблице показан тип каждого параметра, а также тип возвращаемого значения.
Таблица 3 Сводные данные по типам параметров и возвращаемым значениям для примера АР1-интерфейса

Имя функции


Тип возвращае­мого значения


Тип параметра 1


Тип параметра 2


Тип параметров З и 4


await_contact


connection


appnum






make_contact


connection


computer


appnum




aррname_to_аррnum


appnum


сhаг *






cname_to_comp


computer


сhаг *






send


int


connection


сhаг *


int


rесv


int


connection


сhаг *


int


send_eof


int


connection







В следующих разделах приведены примеры прикладных программ, которые показывают, как этот АРI-интерфейс может применяться в клиентском и серверном программном обеспечении для обмена данными2.