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;
}
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;
    }
}
Ce code fonctionne bien pour une connexion, je peux envoyer mes données, les enregistrer dans un fichier, puis déconnecter le socket.
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!