2009-05-21 3 views
3

Wenn ich einen Dateideskriptor (Socket fd), wie Sie dieses fd überprüfen, ist verfügbar für lesen/schreiben? In meiner Situation hat der Client mit dem Server verbunden und wir kennen die FD. Der Server wird jedoch den Socket trennen, gibt es irgendwelche Hinweise, um es zu überprüfen?Check Socket File Descriptor ist verfügbar?

Antwort

4

Sie wollen fcntl() für Schreib-/Leseeinstellungen auf dem fd zu überprüfen:

#include <unistd.h> 
#include <fcntl.h> 

int r; 

r = fcntl(fd, F_GETFL); 
if (r == -1) 
     /* Error */ 
if (r & O_RDONLY) 
    /* Read Only */ 
else if (r & O_WRONLY) 
    /* Write Only */ 
else if (r & O_RDWR) 
    /* Read/Write */ 

Aber das ist ein anderes Thema aus, wenn die Steckdose nicht mehr verbunden ist. Wenn Sie bereits select() oder poll() verwenden, dann sind Sie fast da. poll() wird den Status nett zurückgeben, wenn Sie POLLERR in events angeben und in revents suchen.

Wenn Sie normale blockierende I/O tun, dann behandeln Sie einfach die Lese-/Schreibfehler, wie sie hereinkommen und sich graziös erholen.

0

Sie können hierzu select() oder poll() verwenden.

-1

Nun, Sie könnten wählen(). Wenn der Server die Verbindung getrennt hat, werden Sie eventuell einen Fehlercode erhalten ... Wenn nicht, können Sie mit select() feststellen, ob der Netzwerkstapel bereit ist, weitere Daten zu senden (oder zu empfangen).

+0

ich denke 'select' auslösen können das Argument * exceptedfds *, wenn das Remote-Ende getrennt wurde, aber keinen Fehler zurückgibt –

0

In C# wird diese Frage beantwortet here

Im Allgemeinen Steckdose trennen asynchron ist und muss für die in irgendeiner Art und Weise abgefragt werden. Ein Async-Lesevorgang am Socket wird in der Regel zurückgegeben, wenn er ebenfalls geschlossen wird. Dadurch können Sie den Statuswechsel schneller erfassen. Winsock (Windows) kann sich registrieren, um eine Benachrichtigung über eine Unterbrechung zu erhalten (aber dies kann auch nicht lange dauern, nachdem die andere Seite "verschwunden" ist, es sei denn, Sie verwenden eine Art "Keepalive" (SO_KEEPALIVE) Standard kann nicht für Stunden bemerken, oder ein Application-Level-Herzschlag).

0

fand ich kann die recv überprüfen. wenn Buchse fd schlecht, einige errno gesetzt.

ret = recv(socket_fd, buffer, bufferSize, MSG_PEEK); 
if(EPIPE == errno){ 
// something wrong 
} 
+0

EPIPE bedeutet nicht, dass der Socket FD fehlerhaft ist. Das bedeutet, dass die Verbindung unterbrochen ist. Nicht dasselbe. – EJP

Verwandte Themen