СТА 3/2018
В ЗАПИСНУЮ КНИЖК У ИНЖЕ Н Е РА СТА 3/2018 82 www.cta.ru Листинг 1. Создание серверного TCP-сокета hServerSocket := SysSockCreate(SOCKET_AF_INET, SOCKET_STREAM, SOCKET_IPPROTO_TCP, ADR(result)); // hServerSocket – системный идентификатор типа RTS_IEC_HANDLE, создаваемый SysSockCreate; // SOCKET_AF_INET задаёт сетевой протокол версии IPv4 // SOCKET_STREAM определяет тип создаваемого сокета, в данном случае потоковый режим (TCP); // SOCKET_IPPROTO_TCP определяет протокол сокета, в данном случае TCP; // ADR(result) – указатель на системный идентификатор (handle) результата функции; // result имеет тип структуры RTS_IEC_RESULT и содержит коды ошибок, возникающих // при работе с сокетами Листинг 2. Задание адреса серверного TCP-сокета // Задание адреса сокета для подключения к клиенту // Выбор семейства протоколов: SOCKET_AF_INET соответствует IPv4 serverAddress.sin_family := SOCKET_AF_INET; // Указывается IP-адрес сервера, с которым будет связан сокет // IP := ’10.0.0.100’; result := SysSockInetAddr(IP,ADR(serverAddress.sin_addr.ulAddr)); // Указывается порт сокета // port := 503; serverAddress.sin_port := SysSockHtons(port); Листинг 3. Связывание серверного TCP-сокета с адресом result := SysSockBind(hServerSocket, ADR(serverAddress), SIZEOF(serverAddress)); // Дескриптор серверного сокета hServerSocket связывается с адресом сокета serverAddress, // описываемым структурой SOCKADDRESS. Листинг 4. Старт прослушивания серверного TCP-сокета result := SysSockListen(hServerSocket, maxConnections); // hServerSocket – системный идентификатор серверного сокета; // maxConnections – максимальное количество входящих соединений, например maxConnections := 3; Листинг 5. Создание системного идентификатора клиентского TCP-сокета hClientSocket := SysSockAccept(hServerSocket, ADR(clientAddress), ADR(adressSize), ADR(result)); // hclientSocket - системный идентификатор клиентского сокета; // clientAddress – структура SOCKADDRESS, где хранится адрес клиента; // ADR(adressSize) – указатель на размер структуры SOCKADDRESS (тип DINT). Листинг 6. Получение данных от TCP-клиента bytesRead := SysSockRecv(hClientSocket, ADR(recvBuffer), SIZEOF(recvBuffer), 0, ADR(result)); // bytesRead – количество полученных байт сообщения. В случае ошибки возвращается 0; // hClientSocket – системный идентификатор клиентского сокета; // ADR(recvBuffer) – указатель на переменную, в которой сохраняется принимаемое сообщение; // SIZEOF(recvBuffer) – размер принимаемого сообщения; // Вместо 0 могут быть установлены дополнительные опции для приёма сообщений // (подробнее в описании функции в библиотеке SysSocket); // ADR(result) – указатель на идентификатор результата. Листинг 7. Отправка данных TCP-клиенту bytesSend := SysSockSend(hClientSocket, ADR(sendBuffer), SIZEOF(sendBuffer), 0, ADR(result)); // bytesSend – количество отправленных байт. В случае ошибки возвращается 0; // hClientSocket – системный идентификатор клиентского сокета; // ADR(sendBuffer) указатель на переменную, которая содержит отправляемое сообщение; // SIZEOF(sendBuffer) – размер принимаемого сообщения; // Вместо 0 могут быть установлены опции приёма сообщений; // ADR(result) – указатель на идентификатор результата. Листинг 8. Закрытие TCP-сокета сервера SysSockClose(hServerSocket); // hServerSocket – системный идентификатор серверного сокета.
RkJQdWJsaXNoZXIy MTQ4NjUy