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
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.
Sie können hierzu select()
oder poll()
verwenden.
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).
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).
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
}
EPIPE bedeutet nicht, dass der Socket FD fehlerhaft ist. Das bedeutet, dass die Verbindung unterbrochen ist. Nicht dasselbe. – EJP
- 1. Python-Socket (Socket Error Bad File Descriptor)
- 2. 'Bad file descriptor' Fehler auf einem akzeptierten Socket
- 3. Bad File Descriptor - Heroku Vorarbeiter
- 4. bad file descriptor: Fehler bei accept()
- 5. Bad File Descriptor in Ruby Daemons
- 6. Lesen Contact Info File Descriptor in android
- 7. Unix Domain Sockets übergeben File Descriptor - sendmsg: Transport Endpunkt ist nicht verbunden
- 8. Paypal Fehler: FILE SYSTEM CHECK FAILED
- 9. Bekam "Bad file descriptor", wenn boost :: asio und boost :: thread verwenden
- 10. Check ist Buchse (Winsock spezifisch)
- 11. Shape Descriptor
- 12. Descriptor Konvertierungsproblem
- 13. input [type = "file"] check Existenz von Dateianhang mit css
- 14. Android Datei Descriptor Leckage Debugging
- 15. Datei, in der die Datenstruktur für Global Descriptor und Local Descriptor Tabelle definiert ist?
- 16. Boost Asio TCP Socket verfügbar meldet falsche Anzahl von Bytes
- 17. Lesen Berichte Bad File Descriptor trotz getc erfolgreich die gleiche fd mit einem Zeichen lesen
- 18. Warum bekomme ich "bid file descriptor" in diesem Go-Programm mit stderr und ioutil.ReadAll
- 19. wie scapy zu beheben "Warnung pcapy API erlaubt nicht capure file descriptor"?
- 20. Android Java IOException lesen EBADF (Bad File Number) Aus Datei-Descriptor/Input Stream
- 21. MVC Requesting File Download - Wie behandelt man keine Datei verfügbar?
- 22. Python-Socket-Fehler ist aufgetreten
- 23. Ruby Hash Check ist Teilmenge?
- 24. Ist FILE * gleich stout tragbar?
- 25. Ermitteln, ob FILE * beschreibbar ist
- 26. Human Detection mit HOG Descriptor
- 27. Probleme mit Symbian-Descriptor Zuordnung
- 28. Tomcat: failed Runtime-Descriptor analysieren
- 29. Check ist DJANGO Objekt ist gültig
- 30. Wer ist auf Socket in C verbunden
ich denke 'select' auslösen können das Argument * exceptedfds *, wenn das Remote-Ende getrennt wurde, aber keinen Fehler zurückgibt –