Bonjour,
J'ai quelques doutes à propos de la bonne utilisation de QTcpServer:
J'ai besoin d'écouter les connexions entrantes sur deux ports différents.
Le meilleur moyen d'y parvenir est il d'instancier deux QTcpServer?
Concernant les QTcpSocket, voici mon code:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 void CapIniFileHandler::handleReceptionConnection(){ if(mp_tcpSocket != NULL) { qDebug() << "Une connexion est deja en cours"; return; } mp_tcpSocket = mp_tcpReceptionServer.nextPendingConnection(); if(mp_tcpSocket == NULL) { qDebug() << "*** pas de connexion"; return; } connect(mp_tcpSocket, SIGNAL(disconnected()), this, SLOT(closeSocket())); connect(mp_tcpSocket, SIGNAL(readyRead()), this, SLOT(getConfigFile())); }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 bool CapIniFileHandler::getConfigFile(){ char *l_rawData = new char[MAX_PACKET_SIZE]; qDebug() << "*** get connection file"; if(!mp_configFile.open(QIODevice::WriteOnly)) {return false;} qint64 l_size = mp_tcpSocket->read(l_rawData, MAX_PACKET_SIZE); while(l_size != 0){ if(l_size == -1) {return false;} qDebug() << l_rawData; if(mp_configFile.write(l_rawData, l_size) != l_size) {return false;} l_size = mp_tcpSocket->read(l_rawData, MAX_PACKET_SIZE); } mp_configFile.flush(); mp_configFile.close(); delete l_rawData; return true; }Ce code fonctionne bien pour une connexion, je peux envoyer mes données, les enregistrer dans un fichier, puis déconnecter le socket.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 void CapIniFileHandler::closeSocket(){ if(mp_tcpSocket != NULL){ qDebug() << "closing the socket"; mp_tcpSocket->flush(); this->disconnect(mp_tcpSocket); disconnect(mp_tcpSocket, SIGNAL(disconnected()), this, SLOT(closeSocket())); disconnect(mp_tcpSocket, SIGNAL(readyRead()), this, SLOT(getConfigFile())); mp_tcpSocket->close(); delete mp_tcpSocket; mp_tcpSocket = NULL; } }
Mais j'ai une erreur de segmentation si j'essaie de répéter la manœuvre.
Impossible de choper l'erreur au debugger, j'ai l'impression qu'elle survient avec des résidus de connexion signaux/slots.
Est ce que c'est une bête erreur de programmation, ou alors la manière d'utiliser les sockets n'est pas la bonne?
Merci pour l'aide!
Partager