2009-07-09 6 views
3

Für eine TCP-Socket blockiert, ist es sicher zu nennen:ist es sicher, recv in 0 übergeben, um einen Socket-Fehler zu erkennen?

if(SOCKET_ERROR != recv(s, NULL, 0, 0)) 
//... 

Fehler zu erkennen?

Ich dachte, es war sicher, dann hatte ich eine Situation auf einem Computer, dass es an dieser Aussage hing. (war mit einer SSL-Buchse, wenn das wichtig ist). Ich versuchte auch, das MSG_PEEK-Flag mit einem angegebenen Puffer zu übergeben, aber ich hatte auch einen Hang dort.

Was ist die Alternative?

+0

Ich bin auf Windows, wenn es ankommt. –

Antwort

4

Neben anderen Antworten - hier ist eine handliche kleine Funktion, um die ausstehenden Socket-Fehler zu erhalten:


/* Retrives pending socket error. */ 
int get_socket_error(int sockfd) 
{ 
    int error; 
    socklen_t len(sizeof(error)); 

    if (getsockopt(sockfd, SOL_SOCKET, SO_ERROR, &error, &len) < 0) 
     error = errno; 

    return error; 
} 
3

Sie haben angegeben, dass Sie einen blockierenden Socket verwenden, aber Sie sollten stattdessen auswählen (auch wenn Sie die Blockierung vor dem ausgewählten Anruf festlegen). Sie können einen Dateideskriptor abfragen und sehen, ob Daten warten oder ob ein Fehler vorliegt.

2

Der Anruf selbst ist "sicher" in einem Sinne, dass es als documented funktionieren sollte, jedoch müssen Sie erkennen, dass recv ein blockierender Empfangsanruf ist. Dies bedeutet, dass der Aufruf den ausführenden Thread blockiert, bis Daten am Socket ankommen. Dies kann dazu führen, dass Ihre Anwendung "hängt", wenn Sie nicht einen anderen Thread für den Empfang verwenden, oder prüfen, ob Daten verfügbar sind, bevor der Anruf empfangen wird (select).

Verwandte Themen