Verbindung offen oder geschlossen prüfen (in C unter Linux)

7

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?

    
SjB 25.11.2009, 07:20
quelle

3 Antworten

11

Ich benutze send () statt write () das handle kein Signal:

%Vor%     
SjB 25.11.2009, 09:02
quelle
15

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 :

  • Wenn Sie ein -1 zurückbekommen, gab es ein Problem und Sie sollten errno überprüfen, um festzustellen, ob es wiederherstellbar oder tödlich ist.
  • Wenn du 0 zurückbekommst, kannst du im Moment nichts schreiben (kann ein Netzwerk-Backlog oder ein anderes Problem sein, aber definitiv nicht (noch) tödlich).
  • Wenn Sie einen Wert erhalten, der kleiner ist als das, was Sie wollten, wurde einige der Daten gesendet. Passen Sie Ihre Zeiger an, damit Sie versuchen können, den Rest im nächsten Zyklus zu senden. Nehmen nicht an, dass ein positiver Rückgabewert bedeutet, dass der gesamte Block gesendet wurde.
  • Wenn Sie die gleiche Anzahl wie die Anzahl der Bytes erhalten, die Sie senden wollten, wurde der gesamte Puffer für die Zustellung akzeptiert.
  • Wenn Sie mehr zurückbekommen, als Sie gesendet haben möchten, senden Sie eine E-Mail mit einem bitteren Kommentar an die Kernel-Entwickler. Linus und ich werden das lieben: -)

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.

    
paxdiablo 25.11.2009 07:25
quelle
4

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.

    
Chris Arguin 25.11.2009 07:30
quelle