#include "client.h" #include #include #include Client::Client(QObject *parent) : QObject(parent) { socket = new QTcpSocket(this); #if QT_VERSION > QT_VERSION_CHECK(5, 15, 0) connect(socket, &QTcpSocket::errorOccurred, #else connect(socket, QOverload::of(&QAbstractSocket::error), #endif this, &Client::errorOccurred); connect(socket, &QTcpSocket::connected, this, &Client::connected); connect(socket, &QTcpSocket::disconnected, this, &Client::disconnected); timer = new QTimer(this); timer->setSingleShot(true); connect(timer, &QTimer::timeout, this, &Client::timeout); } bool Client::connectToHost(const QString& host) { this->host = host; retryConnect(); return true; } bool Client::writeData(const QString& title, const QByteArray& data) { if(socket->state() != QAbstractSocket::ConnectedState) { return false; } auto title_data = title.toUtf8(); std::uint32_t title_size = title_data.size(); std::uint32_t data_size = data.size(); // firt write size of the entire payload (without the payload size) std::uint32_t payload_size = data_size + title_size + sizeof(std::uint32_t); socket->write((char*)&payload_size, sizeof(std::uint32_t)); // then write title size and title socket->write((char*)&title_size, sizeof(std::uint32_t)); socket->write(title_data); // finally write the rest of the payload socket->write(data); return socket->waitForBytesWritten(100); // wait at most 100ms } void Client::errorOccurred(QAbstractSocket::SocketError socketError) { if(socketError == QAbstractSocket::NetworkError || socketError == QAbstractSocket::ConnectionRefusedError) { if(retries > 0) { timer->setInterval(interval * 1000); retries--; } else { timer->setInterval(interval_long * 1000); } timer->start(); } } void Client::connected() { emit isConnected(); } void Client::disconnected() { emit isDisconnected(); retryConnect(); } void Client::timeout() { retryConnect(); } void Client::retryConnect() { socket->connectToHost(host, 10024); }