125 lines
2.7 KiB
C++
Executable File
125 lines
2.7 KiB
C++
Executable File
/**
|
|
* $Id$
|
|
* $HeadURL$
|
|
* $Author$
|
|
*/
|
|
|
|
#include <QCoreApplication>
|
|
#include <QStringList>
|
|
#include <QTcpSocket>
|
|
#include <QTimer>
|
|
#include <QDebug>
|
|
#include "main_sim.h"
|
|
|
|
//
|
|
// PayloadSender
|
|
//
|
|
PayloadSender::PayloadSender(int numByte, int ctrFail, QTcpSocket *s, QObject *parent)
|
|
: QObject(parent)
|
|
, m_socket(s)
|
|
, m_timer(new QTimer(this))
|
|
, m_char('1')
|
|
, m_numByte(numByte)
|
|
, m_ctrFail(ctrFail)
|
|
{
|
|
m_timer->setInterval(10 * 1000); // 10s
|
|
m_timer->setSingleShot(false);
|
|
m_timer->start();
|
|
connect(m_timer, &QTimer::timeout,
|
|
this, &PayloadSender::onTimeout);
|
|
}
|
|
|
|
PayloadSender::~PayloadSender()
|
|
{
|
|
if (m_socket->state() != QAbstractSocket::UnconnectedState)
|
|
{
|
|
m_socket->disconnectFromHost();
|
|
m_socket->waitForDisconnected(2000);
|
|
}
|
|
delete m_socket;
|
|
delete m_timer;
|
|
}
|
|
|
|
void PayloadSender::onTimeout()
|
|
{
|
|
static int ctrFail = 0;
|
|
|
|
ctrFail++;
|
|
bool failure = ((ctrFail >= m_ctrFail) && (ctrFail <= (m_ctrFail + 2)));
|
|
|
|
if (!failure)
|
|
{
|
|
qDebug() << "Sending data to socket " << m_socket << " content: 256 * 0x" << QString::number(m_char, 16);
|
|
QByteArray ba(m_numByte, m_char++);
|
|
m_socket->write(ba);
|
|
}
|
|
else
|
|
qDebug() << " +++ Failure: Sending data ";
|
|
}
|
|
|
|
//
|
|
// TcpTestServer
|
|
//
|
|
TcpTestServer::TcpTestServer(int numByte, int ctrFail, QObject *parent)
|
|
: QTcpServer(parent)
|
|
, m_numByte(numByte)
|
|
, m_ctrFail(ctrFail)
|
|
{
|
|
connect(this, &TcpTestServer::newConnection,
|
|
this, &TcpTestServer::onNewIncomingConnection);
|
|
}
|
|
|
|
TcpTestServer::~TcpTestServer()
|
|
{
|
|
qDeleteAll(m_openConnections);
|
|
}
|
|
|
|
void TcpTestServer::onNewIncomingConnection()
|
|
{
|
|
QTcpSocket *newSocket = nextPendingConnection();
|
|
if (!newSocket)
|
|
return;
|
|
PayloadSender *ps = new PayloadSender(m_numByte, m_ctrFail, newSocket, this);
|
|
|
|
connect(newSocket, &QTcpSocket::disconnected,
|
|
ps, &PayloadSender::deleteLater);
|
|
|
|
qDebug() << "Created new payload sender" << ps << "for socket " << newSocket;
|
|
m_openConnections += ps;
|
|
|
|
connect(ps, &PayloadSender::destroyed,
|
|
this, &TcpTestServer::onPayloadSenderDestroyed);
|
|
}
|
|
|
|
void TcpTestServer::onPayloadSenderDestroyed(QObject *obj)
|
|
{
|
|
qDebug() << "Payload sender " << obj << "destroyed";
|
|
m_openConnections -= obj;
|
|
}
|
|
|
|
//
|
|
// main
|
|
//
|
|
int main(int argc, char **argv)
|
|
{
|
|
QCoreApplication app(argc, argv);
|
|
|
|
unsigned short port = 1234;
|
|
int numByte = 40;
|
|
int ctrFail = -10;
|
|
if (app.arguments().size() > 1) port = app.arguments().at(1).toInt();
|
|
if (app.arguments().size() > 2) numByte = app.arguments().at(2).toInt();
|
|
if (app.arguments().size() > 3) ctrFail = app.arguments().at(3).toInt();
|
|
|
|
|
|
TcpTestServer *srv = new TcpTestServer(numByte, ctrFail);
|
|
if (!srv->listen(QHostAddress::Any, port))
|
|
return 1;
|
|
|
|
int ret = app.exec();
|
|
|
|
delete srv;
|
|
|
|
return ret;
|
|
}
|