СТА 3/2018
ных факторов крайне нежелательно, а гарантированность до- ставки сообщений не является критичным требованием, то в качестве альтернативы TCP-сокетов могут использоваться UDP-сокеты. UDP-сокеты устроены проще, чем TCP. В качестве транс- портного уровня используется протокол UDP, который не тре- бует установления соединения и подтверждения приёма [4]. Информация пересылается в предположении, что принимаю- щая сторона её ожидает. Датаграммные сокеты не контролиру- ет ничего, кроме целостности полученных датаграмм. Несмот- ря на это, UDP-сокеты нашли своё применение в системах, где на первом месте стоит именно актуальность данных и их бы- страя доставка, а не гарантия доставки каждого сообщения. Например, сервер в ответ на запросы клиента передаёт по сети текущие значения некоторого параметра, а клиент фор- мирует управляющий сигнал на основе принятых значений. Если клиент опрашивает сервер быстрее, чем скорость изме- нения параметра, то потеря одного-двух UDP-сообщений от сервера существенно не повлияет на качество формирования управляющего сигнала. В случае использования TCP поте- рянный пакет будет автоматически передан повторно, что мо- жет привести к получению клиентом неактуального значения параметра, а значит, к ошибке формирования управляющего сигнала. На рис. 9 представлена схема работы простых серверных и клиентских UDP-сокетов. Серверный UDP-сокет Так же как в случае TCP-сокетов, системный идентификатор UDP-сервера создаётся с помощью функции SysSockCreate() (листинг 14). После создания сокет сервера привязывается к определён- ному IP-адресу и порту с помощью функции SysSockBind() . В отличие от TCP, UDP-сокет не включает прослушивание входящих соединений, а сразу подготавливается к получению данных по сети (листинг 15). Для получения данных по UDP используется функция SysSockRecvFrom() (в отличие от SysSockRecv() для TCP-соке- тов). Её главная особенность в том, что она не просто прини- мает данные от клиента, но и записывает адрес и порт клиента в специальную структуру для хранения адреса SOCKADDRESS , чтобы в дальнейшем сервер знал, куда отправлять ответное со- общение (листинг 16). Ответное сообщение отправляется с помощью функции SysSockSendTo() , которая аналогична SysSockSend() для TCP- протокола, но в качестве аргумента принимает ссылку на ад- рес структуры SOCKADDRESS , где хранится записанный ра- нее адрес клиента (листинг 17). После отправки данных сокет сервера снова переходит к функции SysSockRecvFrom() и остаётся открытым. Но в слу- чае необходимости серверный сокет можно закрыть анало- гично TCP-сокету (листинг 8): Клиентский UDP-сокет Клиент UDP работает аналогично клиентскому сокету TCP, за исключением использования функций SysSockSendTo() и SysSockRecvFrom() для отправки и получения сообщений (рис. 9). Функция SysSockCreate() создаёт системный идентифика- тор сокета. Так же как и в случае сервера, для клиента не- обходимо создать потоковый сокет (листинг 18). В отличие от TCP-сокетов, при использовании UDP-про- токола клиентский сокет не устанавливает соединения с сер- вером, а сразу после создания клиентского сокета переходит к обмену данными с помощью функций SysSockSendTo() и SysSockRecvFrom() (листинг 19). После обмена данными сокет может быть закрыт с помо- щью SysSockClose() (листинг 13). Однако, с точки зрения циклического обмена данными ре- ального времени, каждый раз закрывать и открывать сокет за- ново неэффективно. Поэтому после успешной установки со- единения обмен данными осуществляется в бесконечном цикле. Дополнительные настройки сокетов На рис. 6 показана работа простых серверного и клиент- ского TCP-сокетов. Но на деле такая простая схема имеет не- которые ограничения и недостатки. В ЗАПИСНУЮ КНИЖК У ИНЖЕ Н Е РА СТА 3/2018 86 www.cta.ru Сервер UDP Клиент UDP Инициализация Инициализация Создание сокета клиента Создание сокета сервера hServerSocket = SysSockCreate() Привязка к адресу и порту SysSockBind() Рабочий режим Рабочий режим Окончание работы Окончание работы Закрытие сокета сервера SysSockClose(hServerSocket) SysSockRecvFrom() SysSockSendTo() Закрытие сокета клиента SysSockClose(hClientSocket) SysSockSendTo() SysSockRecvFrom() Получение и отправка сообщений Получение и отправка сообщений hServerSocket = SysSockCreate() Рис. 9. Схема работы простых UDP-сокетов: серверного (слева) и клиентского (справа)
RkJQdWJsaXNoZXIy MTQ4NjUy