СТА 3/2018

Клиентский TCP-сокет Схема работы клиентского сокета отображена на рис. 6 справа. Так же как и в случае серверного сокета, клиентский сокет вначале создаётся функцией SysSockCreate() , в резуль- тате которой создаётся системный идентификатор сокета (ли- стинг 9). Для подключения клиент должен знать IP-адрес и порт сер- вера, который хранится в переменной clientAddress (листинг 10). После этого клиент переходит в рабочий режим и начинает обмениваться данными с сервером (листинг 11). Обмен данными между клиентом и сервером осуществ- ляется с помощью функций SysSockSend() и SysSockRecv() . Данные функции отправляют сообщения серверу и получают от него ответ (листинг 12). После обмена данными сокет может быть закрыт с помо- щью SysSockClose() (листинг 13). Однако, с точки зрения циклического обмена данными ре- ального времени, закрытие сокета при каждом цикле нецеле- сообразно. Поэтому после успешной установки соединения обмен данными осуществляется в бесконечном цикле, до тех пор пока по какой-то причине не появляется необходимость закрыть сокет. Особенности TCP-сокетов Использование TCP-сокетов позволяет приложениям кли- ента и сервера обмениваться данными почти прозрачно, не заботясь о поддержании сетевого соединения, доставке паке- тов по сети, порядке передачи пакетов и буферизации. TCP- сокеты гарантируют доставку сообщений и правильный по- рядок пакетов, а также пересылают пакеты повторно, если подтверждение о передаче не приходит в течение определён- ного промежутка времени [4]. Таким образом, использовать TCP-сокеты уместно там, где необходима гарантированная доставка данных. Несмотря на многие преимущества, TCP-сокеты имеют и негативные стороны. Например, необходимость поддержания TCP-соединения уменьшает пропускную способность обмена данными в распределённых системах. Также в системах обме- на данными реального времени повторная передача потерян- ных пакетов может привести к тому, что система получит дан- ные, которые утратили свою актуальность. UDP-сокеты Все перечисленные недостатки TCP-сокетов связаны с осо- бенностью TCP-протокола. Если в системе присутствие дан- В ЗАПИСНУЮ КНИЖК У ИНЖЕ Н Е РА СТА 3/2018 84 www.cta.ru Листинг 9. Создание клиентского TCP-сокета hClientSocket := SysSockCreate(SOCKET_AF_INET, SOCKET_STREAM, SOCKET_IPPROTO_TCP,ADR(result)); // hClientSocket – системный идентификатор клиентского сокета; // SOCKET_AF_INET задаёт сетевой протокол IPv4; // SOCKET_STREAM определяет тип сокета, в данном случае потоковый сокет (TCP); // SOCKET_IPPROTO_TCP определяет протокол сокета, в данном случае TCP; // ADR(result) – указатель на системный идентификатор (handle) результата функции. Листинг 10. Задание адреса для подключения клиентского TCP-сокета к TCP-серверу // Задаётся адрес сокета для подключения // Выбор семейства протоколов: SOCKET_AF_INET соответствует IPv4 clientAddress.sin_family := SOCKET_AF_INET; // Задание порта сокета для подключения // port := 503; clientAddress.sin_port:=SysSockHtons(port); // Задание IP-адреса сервера // IP := ’10.0.0.100’; result := SysSockInetAddr(IP, ADR(clientAddress.sin_addr)); Листинг 11. Подключение клиентского сокета к серверу result := SysSockConnect(hClientSocket, ADR(clientAddress), SIZEOF(clientAddress)); // hClientSocket – системный идентификатор клиентского сокета; // ADR(clientAddress) – указатель на структуру SOCKADDRESS с адресом сокета сервера; // SIZEOF(clientAddress) – размер структуры адреса сокета. Листинг 12. Обмен данными между TCP-клиентом и TCP-сервером bytesSend := SysSockSend(hClientSocket, ADR(sendMessage), SIZEOF(sendMessage), 0,ADR(result)); bytesRecv := SysSockRecv(hClientSocket, ADR(recvMessage), SIZEOF(recvMessage), 0, ADR(result)); // hClientSocket – системный идентификатор клиентского сокета; // ADR(sendMessage/recvMessage) - указатель на отправляемое/полученное сообщение; // SIZEOF(sendMessage/recvMessage), размер отправленного/полученного сообщения; // ADR(result) – указатель на системный идентификатор (handle) результата функции. Листинг 13. Закрытие клиентского TCP-сокета SysSockClose(hClientSocket); // где hClientSocket – системный идентификатор серверного сокета.

RkJQdWJsaXNoZXIy MTQ4NjUy