Seite 1 von 1

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

Verfasst: 8. September 2011 15:42
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

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

Verfasst: 8. September 2011 18:25
von Christian81
timeout != error.
Ich würde mich eher fragen warum im 'Gutfall ' ein error kommt - was für ein ErrorCode ist es?

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

Verfasst: 9. September 2011 01:19
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. :|

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

Verfasst: 9. September 2011 08:32
von Christian81
Im Falle von error() gibst du qWarning("Fehler"); aus und keinen Fehlercode...

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

Verfasst: 9. September 2011 11:26
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...