Очередь подключений в QTcpServer

Пытаюсь сделать многопоточный сервер при помощи QtcpServer и QTcpSocket. По задумке, одновременно должно быть подключено не более maxConnectionNumber пользователей. В коде для теста я поставил 1. Я создаю экземпляр сервера, и слушаю, когда появляется новое соединение, вызывается incomingConnection(qintptr socketDescriptor), создается поток куда передается сокет, счетчик подключений увеличивается и если он равен maxConnectionNumber, то прием новых соединений останавливается с помощью pauseAccepting(). Как только клиент отсоединяется и счетчик уменьшается и прием новых соединений возобновляется с помощью resumeAccepting().

По факту, если я запускаю программу, где максимальное число доступных подключений = 1, и делаю, например, 3 подключения, то первое подключение проходит успешно, поступление создание новых сокетов и потоков не происходит, 2 сигнала висят в очереди, как только 1 пользователь дисконнектится, то подключаются сразу все соединения, которые висели в очереди. Я бы хотел принимать их по очередно, чтобы общее количество подключенных клиентов было не более maxConnectionNumber . Спасибо!

//Server.cpp
Server::Server(QObject *parent)
{

}

void Server::startServer()
{
    if(!this->listen(QHostAddress::Any, 1234))
    {
        qDebug() << "Cold not start server";
    }else
    {
        qDebug() << "Listening...";
    }
}

void Server::clientDisconnected()
{
    connectionsCounter--;
    if (connectionsCounter < maxConnectionNumber)
    {
        this->resumeAccepting();
    }
}

void Server::incomingConnection(qintptr socketDescriptor)
{
    qDebug() << socketDescriptor << " Connecting";
    connectionsCounter++;
    if (connectionsCounter >= maxConnectionNumber)
    {
        this->pauseAccepting();
    }
    MyThread *thread = new MyThread(socketDescriptor, this);
    connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));
    thread->start();
}

//MyThread.cpp
#include "mythread.h"

MyThread::MyThread(qintptr ID, QObject *parent)
{
    this->socketDescriptor = ID;
    this->parent = parent;
}

void MyThread::run()
{
    qDebug() << socketDescriptor << "Starting thread";
    socket = new QTcpSocket();

    if (!socket->setSocketDescriptor(this->socketDescriptor))
    {
        emit error(socket->error());
        return;
    }

    connect(socket, SIGNAL(readyRead()), this, SLOT(readyRead()));
    connect(socket, SIGNAL(disconnected()), parent, SLOT(clientDisconnected()));
    connect(socket, SIGNAL(disconnected()), this, SLOT(disconected()));


    qDebug() << socketDescriptor << "Client Conected";

    exec();
}

void MyThread::readyRead()
{
    QByteArray data = socket->readAll();

    qDebug() << socketDescriptor << "Data in" << data;

    socket->write(data);
}

void MyThread::disconected()
{
    qDebug() << socketDescriptor << "disconnected";
    socket->deleteLater();
    exit(0);
}

Ответы (0 шт):