2017-12-10 7 views
1

ich ein Timeout auf meine blockierenden Socket gesetzt haben ..(recv() == 0) bedeutet, dass die Verbindung getrennt oder abgelaufen ist? (Steckdosen, Linux und Windows)

DWORD to = 1200; 
if (setsockopt (soc, SOL_SOCKET, SO_RCVTIMEO, (char *)&to, sizeof(to))) { 
    ... 
} 

In dem Fall, dass recv() dann Null zurückkehrt, wie kann ich das sagen, ist Link lesen getrennt oder abgelaufen? Wenn es t/o ist, würde ich gerne mehr lesen, wenn es discon ist, würde ich gerne andere Maßnahmen ergreifen. Mir ist klar, dass ich einfach das T/O entfernen könnte, dann würde ich wissen, dass es discon ist, aber ich muss auch routinemäßig überwachen, wie der Lesevorgang voranschreitet.

Jede Hilfe sehr geschätzt. Prost - Reiche

Antwort

3

Vom SO_RCVTIMEO Abschnitt der Manpage socket:

Aus der Manpage für recv:

These calls return the number of bytes received, or -1 if an error 
occurred. In the event of an error, errno is set to indicate the 
error. 

When a stream socket peer has performed an orderly shutdown, the 
return value will be 0 (the traditional "end-of-file" return). 

Datagram sockets in various domains (e.g., the UNIX and Internet 
domains) permit zero-length datagrams. When such a datagram is 
received, the return value is 0. 

The value 0 may also be returned if the requested number of bytes to 
receive from a stream socket was 0. 

Ein Aufruf recv wird 0 auf disconnect zurückzukehren, oder wenn ein Datagramm mit einer Länge von Null empfangen wird oder wenn die angeforderte Anzahl von Bytes 0 ist.

Ein Anruf an recv wird -1 auf einen Fehler, einschließlich einer Zeitüberschreitung zurückgeben. Sie müssen errno untersuchen, um zwischen einem Timeout und einem anderen Fehler zu unterscheiden.

Verwandte Themen