socket connection status

08/21/2012 12:42 Tyrar#1
und da habe ich wieder ein problem mit den sockets :)

ich connecte mit einem nonblocking socket zu einem server. soweit alles gut, wenn ich allerdings vom server getrennt werde, bekomme ich das nicht mit.

aktuell versuche ich das so:

Code:
        int r = select(this->m_socket+1,&fdread,&fdwrite,nullptr,&tv);

        if(r<=0)
            return false;
Code:
        r = recv(this->m_socket,this->m_recvBuffer,this->m_recvAllocSize,0);
        if(r<len) {
            if(WSAGetLastError() != WSAEWOULDBLOCK)
                return false;
            else
                return true;
        }
Code:
            if(send(this->m_socket,this->m_sendBuffer,sendLen,0)<sendLen) {
                if(WSAGetLastError() != WSAEWOULDBLOCK)
                    return false;
                else
                    return true;
            }
hab schon ewig gegoogelt, aber es wird dauerhaft true returned.
wireshark sagt mir übrigens auch, dass ich disconnect werde!
08/21/2012 15:04 link#2
Steppe den Code doch mal durch, welcher return-Zweig wird denn genommen?

Code:
if(r<len) {
  if(WSAGetLastError() != WSAEWOULDBLOCK)
    return false;
  else
    return true;
}
recv gibt, wenn die Verbindung geschlossen wurde, 0 zurück, was aber kein Fehler ist, sodass sich auch nicht WSAGetLastError benutzen lässt.
Reagiere mal gesondert auf (r = recv(...)) == 0. Oder du guckst, ob im filedescriptor-readability Array dein Client-Socket ist und überprüfst dann via ioctlsocket(this->m_socket, FIONREAD, &count) ob nichts zu empfangen ist, die Verbindung also geschlossen wurde, was die Methode für blocking sockets wäre, um nicht im recv festzustecken.
08/21/2012 15:53 Tyrar#3
Quote:
Originally Posted by link View Post
Steppe den Code doch mal durch, welcher return-Zweig wird denn genommen?

Code:
if(r<len) {
  if(WSAGetLastError() != WSAEWOULDBLOCK)
    return false;
  else
    return true;
}
recv gibt, wenn die Verbindung geschlossen wurde, 0 zurück, was aber kein Fehler ist, sodass sich auch nicht WSAGetLastError benutzen lässt.
Reagiere mal gesondert auf (r = recv(...)) == 0. Oder du guckst, ob im filedescriptor-readability Array dein Client-Socket ist und überprüfst dann via ioctlsocket(this->m_socket, FIONREAD, &count) ob nichts zu empfangen ist, die Verbindung also geschlossen wurde, was die Methode für blocking sockets wäre, um nicht im recv festzustecken.
wenn die verbindung geschlossen wurde ist das kein fehler? wozu sind dann die fehler wie WSAECONNRESET o.ä. da? außerdem returned recv bei mir -1!

jedenfalls funktioniert es jetzt, ty :)