diff options
Diffstat (limited to 'mock-server')
| -rw-r--r-- | mock-server/CMakeLists.txt | 2 | ||||
| -rw-r--r-- | mock-server/EchoServer.cpp | 50 | ||||
| -rw-r--r-- | mock-server/EchoServer.h | 24 | ||||
| -rw-r--r-- | mock-server/main.cpp | 55 |
4 files changed, 80 insertions, 51 deletions
diff --git a/mock-server/CMakeLists.txt b/mock-server/CMakeLists.txt index 52bfabb..f5d54f8 100644 --- a/mock-server/CMakeLists.txt +++ b/mock-server/CMakeLists.txt @@ -1,4 +1,4 @@ -qt_add_executable(Xpl2MockServer main.cpp) +qt_add_executable(Xpl2MockServer main.cpp EchoServer.h EchoServer.cpp) set_target_properties(Xpl2MockServer PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/bin") diff --git a/mock-server/EchoServer.cpp b/mock-server/EchoServer.cpp new file mode 100644 index 0000000..43fc6f9 --- /dev/null +++ b/mock-server/EchoServer.cpp @@ -0,0 +1,50 @@ +/** + * @file EchoServer.cpp + * @brief Simple TCP echo server for a single port. + */ +#include "EchoServer.h" + +#include <QTcpSocket> + +EchoServer::EchoServer (quint16 port, const char *name, QObject *parent) + : QTcpServer (parent), m_name (name), m_port (port) +{ + connect (this, &QTcpServer::newConnection, this, + &EchoServer::onNewConnection); + + if (!listen (QHostAddress::Any, port)) + qCritical ("Failed to listen on %s port %d: %s", m_name, m_port, + qPrintable (errorString ())); + else + qInfo ("Listening on %s port %d", m_name, m_port); +} + +void +EchoServer::onNewConnection () +{ + while (auto *sock = nextPendingConnection ()) + { + qInfo ("[%s:%d] client connected", m_name, m_port); + connect (sock, &QTcpSocket::readyRead, this, + &EchoServer::onClientReadyRead); + connect (sock, &QTcpSocket::disconnected, this, + &EchoServer::onClientDisconnected); + } +} + +void +EchoServer::onClientReadyRead () +{ + auto *sock = qobject_cast<QTcpSocket *> (sender ()); + QByteArray data = sock->readAll (); + qInfo ("[%s:%d] echo %lld bytes", m_name, m_port, data.size ()); + sock->write (data); +} + +void +EchoServer::onClientDisconnected () +{ + auto *sock = qobject_cast<QTcpSocket *> (sender ()); + qInfo ("[%s:%d] client disconnected", m_name, m_port); + sock->deleteLater (); +} diff --git a/mock-server/EchoServer.h b/mock-server/EchoServer.h new file mode 100644 index 0000000..2e51b1e --- /dev/null +++ b/mock-server/EchoServer.h @@ -0,0 +1,24 @@ +/** + * @file EchoServer.h + * @brief Simple TCP echo server for a single port. + */ +#pragma once + +#include <QTcpServer> + +class EchoServer : public QTcpServer +{ + Q_OBJECT + +public: + EchoServer (quint16 port, const char *name, QObject *parent = nullptr); + +private slots: + void onNewConnection (); + void onClientReadyRead (); + void onClientDisconnected (); + +private: + const char *m_name; + quint16 m_port; +}; diff --git a/mock-server/main.cpp b/mock-server/main.cpp index 4818d6f..0694e4d 100644 --- a/mock-server/main.cpp +++ b/mock-server/main.cpp @@ -2,63 +2,18 @@ * @file main.cpp * @brief Mock XPL2 server — echoes back on three ports. */ -#include <QCoreApplication> -#include <QTcpServer> -#include <QTcpSocket> - -static QTcpServer * -listenOn (quint16 port, const char *name, QObject *parent) -{ - auto *server = new QTcpServer (parent); - - QObject::connect ( - server, &QTcpServer::newConnection, server, - [=] () - { - while (auto *sock = server->nextPendingConnection ()) - { - qInfo ("[%s:%d] client connected", name, port); - - QObject::connect (sock, &QTcpSocket::readyRead, sock, - [=] () - { - QByteArray data = sock->readAll (); - qInfo ("[%s:%d] echo %lld bytes", name, - port, data.size ()); - sock->write (data); - }); +#include "EchoServer.h" - QObject::connect (sock, &QTcpSocket::disconnected, sock, - [=] () - { - qInfo ("[%s:%d] client disconnected", name, - port); - sock->deleteLater (); - }); - } - }); - - if (!server->listen (QHostAddress::Any, port)) - { - qCritical ("Failed to listen on %s port %d: %s", name, port, - qPrintable (server->errorString ())); - } - else - { - qInfo ("Listening on %s port %d", name, port); - } - - return server; -} +#include <QCoreApplication> int main (int argc, char *argv[]) { QCoreApplication app (argc, argv); - listenOn (9110, "Command", &app); - listenOn (9111, "Imaging", &app); - listenOn (9112, "Status", &app); + new EchoServer (9110, "Command", &app); + new EchoServer (9111, "Imaging", &app); + new EchoServer (9112, "Status", &app); return app.exec (); } |
