[gelöst] TCP-Socket: error()-Signal kommt manchmal nicht an

Alles rund um die Programmierung mit Qt
Antworten
shinji
Beiträge: 23
Registriert: 28. Juli 2010 19:01

[gelöst] TCP-Socket: error()-Signal kommt manchmal nicht an

Beitrag von shinji »

Hallo!

Ich habe mir einen simplen TCP-Client geschrieben, bei dem der Verbindungsaufbau durch ein waitForConnected() zeitlich begrenzt wird. Jetzt soll nach Ablauf der eingestellten Zeit das error-Signal gesendet werden, welches ich dann in meinem Hauptfenster abfangen kann. So weit ganz einfach. Jetzt kommt es aber oft vor, dass nach einem Timeout scheinbar das Error-Signal nicht gesendet wird. Es passiert dann einfach nichts. :(

Code: Alles auswählen

Network::Network(QWidget *parent)
{
    tcpSocket = new QTcpSocket(this);
...
    connect(tcpSocket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(socketError(QAbstractSocket::SocketError)));
    connect(tcpSocket, SIGNAL(stateChanged(QAbstractSocket::SocketState)), this, SLOT(socketStateChanged(QAbstractSocket::SocketState)));
...
}

...
...

void Network::connectHost()
{
    if (connected == true)
    {
        disconnectHost();
    }
    else
    {
        tcpSocket->abort();
        tcpSocket->connectToHost(dstIp, dstPort);
        if (!tcpSocket->waitForConnected(connectTimeout))
        {
            qWarning(QString("waitForConnected(): ").toLatin1() + tcpSocket->errorString().toLatin1()+" "+QString::number(tcpSocket->error()).toLatin1());
            disconnectHost();
        }
    }
}

void Network::socketError(QAbstractSocket::SocketError err)
{
    connected = false;
    qWarning("Fehler");
    emit onError(err);
}

void Network::socketStateChanged(QAbstractSocket::SocketState state)
{
    qWarning(QString("Socket Status: "+QString::number(state)).toLatin1());
    emit onStateChanged(state);
}

...
...
Im Falle eines Timeouts steht auf der Konsole im Gutfall immer:

Code: Alles auswählen

Socket Status: 1
Socket Status: 2
Socket Status: 0
Fehler
Socket Status: 0
waitForConnected(): Socket operation timed out 5
Im Fehlerfall (kein Error-Signal) allerdings nur das hier:

Code: Alles auswählen

Socket Status: 1
Socket Status: 2
Socket Status: 0
waitForConnected(): Socket operation timed out 5
Woran liegt das?

Gruß
Thorsten
Zuletzt geändert von shinji am 13. September 2011 23:18, insgesamt 1-mal geändert.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: TCP-Socket: error()-Signal kommt manchmal nicht an

Beitrag von Christian81 »

timeout != error.
Ich würde mich eher fragen warum im 'Gutfall ' ein error kommt - was für ein ErrorCode ist es?
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
shinji
Beiträge: 23
Registriert: 28. Juli 2010 19:01

Re: TCP-Socket: error()-Signal kommt manchmal nicht an

Beitrag von shinji »

Der Aufgetretene Fehler inkl. der ID steht ja in meiner Debugausgabe: "Socket operation timed out 5"

Eigentlich macht waitForConnected() doch genau genau das, was ich erwarte:
http://doc.qt.nokia.com/latest/qabstrac ... rConnected
Waits until the socket is connected, up to msecs milliseconds. If the connection has been established, this function returns true; otherwise it returns false. In the case where it returns false, you can call error() to determine the cause of the error.
In meinem Fall kommt es zwar mit false zurück, ein Fehlercode ist ja auch vorhanden... aber das error-Signal wird dann manchmal nicht gesendet und manchmal doch. :|
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: TCP-Socket: error()-Signal kommt manchmal nicht an

Beitrag von Christian81 »

Im Falle von error() gibst du qWarning("Fehler"); aus und keinen Fehlercode...
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
shinji
Beiträge: 23
Registriert: 28. Juli 2010 19:01

Re: TCP-Socket: error()-Signal kommt manchmal nicht an

Beitrag von shinji »

Oh, sorry. Du hast Recht. Ich sollte früher ins Bett gehen :)

Seltsame Sache.... wollte es gerade noch einmal ausprobieren und jetzt bekomme ich nie ein error-Signal.
Ich werde da wohl noch mal was testen müssen... seltsam...
Antworten