# HG changeset patch # User displacer # Date 1160073190 0 # Node ID 3b777d7008d9c09e3173c41cb020ef0f1c374c4b # Parent f97a7a3dc8f6f9c65ad7fc5f200924898d0b2a89 static TCP Server diff -r f97a7a3dc8f6 -r 3b777d7008d9 QTfrontend/tcpBase.cpp --- a/QTfrontend/tcpBase.cpp Thu Oct 05 17:02:09 2006 +0000 +++ b/QTfrontend/tcpBase.cpp Thu Oct 05 18:33:10 2006 +0000 @@ -22,44 +22,47 @@ #include #include -#include #include "hwconsts.h" QList srvsList; +int TCPBase::isIPCServerStarted=0; +QTcpServer* TCPBase::IPCServer(0); TCPBase::TCPBase(bool demoMode) : - m_isDemoMode(demoMode) + m_isDemoMode(demoMode), + IPCSocket(0) { - IPCServer = new QTcpServer(this); + if(!isIPCServerStarted++) { + IPCServer = new QTcpServer(this); + IPCServer->setMaxPendingConnections(1); + if (!IPCServer->listen(QHostAddress::LocalHost, IPC_PORT)) { + QMessageBox::critical(0, tr("Error"), + tr("Unable to start the server: %1.") + .arg(IPCServer->errorString())); + } + } connect(IPCServer, SIGNAL(newConnection()), this, SLOT(NewConnection())); - IPCServer->setMaxPendingConnections(1); } void TCPBase::NewConnection() { + if(IPCSocket) { + // connection should be already finished + return; + } QTcpSocket * client = IPCServer->nextPendingConnection(); - if(!IPCSocket) { - IPCServer->close(); - IPCSocket = client; - connect(client, SIGNAL(disconnected()), this, SLOT(ClientDisconnect())); - connect(client, SIGNAL(readyRead()), this, SLOT(ClientRead())); - SendToClientFirst(); - } else { - qWarning("2nd IPC client?!"); - client->disconnectFromHost(); - } + if(!client) return; + IPCSocket = client; + connect(client, SIGNAL(disconnected()), this, SLOT(ClientDisconnect())); + connect(client, SIGNAL(readyRead()), this, SLOT(ClientRead())); + SendToClientFirst(); } void TCPBase::RealStart() { IPCSocket = 0; - if (!IPCServer->listen(QHostAddress::LocalHost, IPC_PORT)) { - QMessageBox::critical(0, tr("Error"), - tr("Unable to start the server: %1.") - .arg(IPCServer->errorString())); - } - + QProcess * process; process = new QProcess; connect(process, SIGNAL(error(QProcess::ProcessError)), this, SLOT(StartProcessError(QProcess::ProcessError))); @@ -70,7 +73,7 @@ void TCPBase::ClientDisconnect() { IPCSocket->close(); - IPCServer->close(); + //IPCServer->close(); onClientDisconnect(); @@ -98,7 +101,7 @@ disconnect(srvsList.front(), SIGNAL(isReadyNow()), *(++srvsList.begin()), SLOT(tcpServerReady())); srvsList.pop_front(); - QTimer::singleShot(150, this, SLOT(RealStart())); + RealStart(); } void TCPBase::Start() @@ -110,6 +113,7 @@ srvsList.push_back(this); return; } + RealStart(); } diff -r f97a7a3dc8f6 -r 3b777d7008d9 QTfrontend/tcpBase.h --- a/QTfrontend/tcpBase.h Thu Oct 05 17:02:09 2006 +0000 +++ b/QTfrontend/tcpBase.h Thu Oct 05 18:33:10 2006 +0000 @@ -35,7 +35,7 @@ class TCPBase : public QObject { Q_OBJECT - + public: TCPBase(bool demoMode); @@ -59,12 +59,14 @@ virtual void SendToClientFirst(); private: + static int isIPCServerStarted; + static QTcpServer* IPCServer; + bool m_isDemoMode; - QTcpServer * IPCServer; + void RealStart(); QTcpSocket * IPCSocket; private slots: - void RealStart(); void NewConnection(); void ClientDisconnect(); void ClientRead();