aboutsummaryrefslogtreecommitdiffstats
path: root/mock-server/EchoServer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'mock-server/EchoServer.cpp')
-rw-r--r--mock-server/EchoServer.cpp50
1 files changed, 50 insertions, 0 deletions
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 ();
+}