Ich habe einen Server geschrieben, der jede eingehende Verbindung in einen extra Thread verwaltet.
Wenn ich dann den Server stoppen will und somit alle Verbindungen zu den Clients schließen will, schließt er bei mir nur immer die Hälfte der Verbindungen.
Hier die logout() - Methode von meinem Connection-Thread:
Code: Alles auswählen
ClientConnectionThread::ClientConnectionThread(QTcpSocket * socket, QList<ClientConnectionThread*> * clientConnectionThreadList, QObject* parent /*= 0*/ ) : QThread(parent)
{
this->clientConnectionThreadList = clientConnectionThreadList;
this->socket = socket;
}
void ClientConnectionThread::logout() {
this->socket->disconnectFromHost();
}
Hier der Code-Ausschnitt von meinem Server:
Code: Alles auswählen
MainWindow::MainWindow( QWidget* parent /*= 0*/, Qt::WFlags flags /*= 0*/ ) : QMainWindow(parent, flags)
{
setupUi(this);
this->tcpServer = new QTcpServer(this);
this->clientConnectionThreadList = new QList<ClientConnectionThread*>();
if (this->tcpServer->listen(QHostAddress(this->lineEditServerHost->text()),this->spinBoxServerPort->value()))
{
connect(this->tcpServer,SIGNAL(newConnection()),this,SLOT(newClientConnection()));
}
}
void MainWindow::on_pushButtonServerStop_pressed() {
//stop TCP - Server
for(int i=0; i<this->clientConnectionThreadList->count(); i++)
{
//an dieser Stelle läuft er nur bis zur Hälfte der Liste und kann dann in der logout()-Methode nicht weiter disconnectFromHost() erfolgreich
ausführen
clientConnectionThreadList->at(i)->logout();
}
this->tcpServer->close();
}
void MainWindow::newClientConnection() {
qDebug("new connection is available");
QTcpSocket * socket = this->tcpServer->nextPendingConnection();
ClientConnectionThread * clientConnectionThread = new ClientConnectionThread(socket, this->clientConnectionThreadList,this);
connect(clientConnectionThread,SIGNAL(finished()),clientConnectionThread,SLOT(deleteLater()));
clientConnectionThread->start();
//add new ClientConnectionThread to List
this->clientConnectionThreadList->append(clientConnectionThread);
}