/
MaximU
/
application
Обзор
Документация
Войти
/
MaximU
/
application
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
tcpconnectionclient.cpp
151 строка
3 KB
Максим
Приведение типов в стиле c++.
09 июл 2026, 02:14
09 июл 2026, 02:14
abb0e18
Код
Авторство
О чём код?
#include "tcpconnectionclient.h" #include "exchangeinfo.h" /*! * \brief Конструктор. * \param id Идентификатор соединения. * \param name Имя соединения. * \param label Метка соединения. * \param socket Сокет. */ TcpConnectionClient::TcpConnectionClient(int id, const QString &name, const QString &label, QTcpSocket *socket) : ConnectionClient(id, name, label, socket) { if (mDevice == nullptr) { mDevice = new QTcpSocket(); } QObject::connect(mDevice, SIGNAL(connected()), this, SLOT(slot_device_connected())); QObject::connect(mDevice, SIGNAL(disconnected()), this, SLOT(slot_device_disconnected())); QObject::connect(mDevice, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(slot_socket_error(QAbstractSocket::SocketError))); QObject::connect(mDevice, SIGNAL(readyRead()), this, SLOT(slot_device_readyRead())); } /*! * \brief Устанавливает cоединение с хостом. */ void TcpConnectionClient::connect() { QTcpSocket *socket = qobject_cast<QTcpSocket *>(mDevice); if (!socket) { return; } socket->connectToHost(mAddress, mPort); } /*! * \brief Разрывает cоединение с хостом. */ void TcpConnectionClient::disconnect() { QTcpSocket *socket = qobject_cast<QTcpSocket *>(mDevice); if (!socket) { return; } socket->abort(); } /*! * \brief Выполняется при возникновении ошибки сокета. * \param error Код ошибки. */ void TcpConnectionClient::slot_socket_error(QAbstractSocket::SocketError error) { switch (error) { case QAbstractSocket::ConnectionRefusedError: case QAbstractSocket::HostNotFoundError: repeat(); return; case QAbstractSocket::RemoteHostClosedError: return; default: disconnect(); break; } } /*! * \brief Читает данные из устройства. */ void TcpConnectionClient::readDevice() { while (mDevice->bytesAvailable() != 0) { if (mBytesRead == 0) { acquireBuffer(); mReading = true; emit beginReadPortion(this); } //// Прием заголовка. if (mBytesRead < sizeof(ExchangeInfo::Header)) { int r = mDevice->read(mBuffer.get() + mBytesRead, sizeof(ExchangeInfo::Header) - mBytesRead); if (r > 0) { mBytesRead += r; } if (mBytesRead == sizeof(ExchangeInfo::Header)) { //// Проверка контрольных слов. ExchangeInfo::Header *header = reinterpret_cast<ExchangeInfo::Header *>(mBuffer.get()); if (header->controlWord1 != ExchangeInfo::Header::ControlWord1 || header->controlWord2 != ExchangeInfo::Header::ControlWord2) { releaseBuffer(); mBytesRead = 0; disconnect(); return; } } } //// Прием информационной части. if (mBytesRead >= sizeof(ExchangeInfo::Header)) { ExchangeInfo *info = reinterpret_cast<ExchangeInfo *>(mBuffer.get()); int r = mDevice->read(mBuffer.get() + mBytesRead, info->header.length - mBytesRead); if (r > 0) { mBytesRead += r; } if (mBytesRead == info->header.length) { mReading = false; mTimeReceive = QDateTime::currentDateTime(); releaseData(); emit endReadPortion(this); mBytesRead = 0; setProperty("id", info->header.id); } } } }