Bei der Socket-Programmierung unter Linux muss ich Daten in den Socket schreiben, aber ich weiß nicht, ob der Socket offen oder geschlossen ist. Wie kann ich wissen, dass Socket geöffnet und geschlossen wird ohne zu lesen?
%Vor%Ich habe von sockfd gelesen und bin sicher, dass diese Verbindung offen ist. Wann ich in newsockfd einen Puffer schreiben soll weiß ich nicht, dass newsockfd geöffnet ist oder wie man überprüft, ob newsockfd geschlossen ist?
Ich kenne ein Problem. in der Mitte des Schreibens Verbindung geschlossen. Schreiben Sie zum Beispiel 1024 Daten in 500 Verbindung geschlossen und Programm geschlossen. Wie vermeide ich das?
Um zu überprüfen, ob Sie in einen Socket schreiben können, versuchen Sie überraschenderweise, es zu schreiben: -)
Wenn der Socket geschlossen wurde, erhalten Sie einen -1
Return-Code von write
und Sie können errno
untersuchen, um zu sehen, was das Problem war.
Wenn der Socket noch gültig ist, Sie aber gerade keine Daten schreiben können, gibt write
0 zurück. Der read
-Aufruf verhält sich ebenfalls ähnlich und gibt -1
zurück, wenn ein Problem vorliegt.
Grundsätzlich für write
:
-1
zurückbekommen, gab es ein Problem und Sie sollten errno
überprüfen, um festzustellen, ob es wiederherstellbar oder tödlich ist. 0
zurückbekommst, kannst du im Moment nichts schreiben (kann ein Netzwerk-Backlog oder ein anderes Problem sein, aber definitiv nicht (noch) tödlich). Update: Wie caf in den Kommentaren darauf hingewiesen hat, habe ich vergessen, die Signalbehandlung zu berücksichtigen. Sie müssen das unterbrochene Rohrsignal ignorieren oder write
wird intern fehlschlagen, indem Sie dieses Signal auslösen.
Sie können dies tun, indem Sie Folgendes einfügen:
%Vor%bevor Sie beginnen, die Socket-Funktionen zu verwenden. Sie können dann verwenden:
%Vor%um die vorherige Signalverarbeitung wiederherzustellen.
Socket-Programmierung kann ziemlich schwierig sein, weil Sie oft erst viel später wissen, dass ein Fehler aufgetreten ist.
Wenn zum Beispiel der Computer, an den Sie schreiben, abnormal abbricht, kann der Schreibaufruf erfolgreich sein (weil Sie in Ihre internen BS-Puffer schreiben konnten), nur um während des Schließen-Aufrufs fehlzuschlagen.
Wenn Sie nicht wissen, auf welche Art und Weise der Socket auf Anwendungsebene überprüft werden kann (d. h. eine Nachricht senden und innerhalb eines bestimmten Zeitraums eine Antwort anfordern muss), haben Sie keine Möglichkeit, dies zu wissen. Wenn Sie ein Standardprotokoll verwenden, ist möglicherweise bereits etwas vorhanden, um Fehler zu behandeln.
Die kurze Antwort ist also, dass Sie bei fast jedem Anruf, der den Socket berührt (Lesen, Schreiben, Schließen, usw.), nach Fehlerrückmeldungen suchen müssen.
Tags und Links c sockets linux network-programming