close () Socket direkt nach send (): unsicher?
Ist es klug/sicher close()
eine Buchse direkt nach der letzten send()
?
Ich weiß, dass TCP soll, um zu versuchen, um alle verbleibenden Daten in den sende-Puffer auch nach dem schließen des socket, aber kann ich die wirklich zählen?
Ich werde dafür sorgen, dass es keine verbleibenden Daten im Puffer vorhanden, so dass keine RST gesendet wird, nach meiner Nähe.
In meinem Fall, der in der Nähe ist eigentlich die Letzte Anweisung der code vor dem Aufruf exit()
.
Wird der TCP-stack wirklich weiter versuchen und übertragen die Daten auch nach dem Prozess senden es beendet hat? Ist das so zuverlässig wie das warten auf einen beliebigen timeout-mich vor dem Aufruf close()
durch Einstellung SO_LINGER?
Ist, tun die gleiche TCP-timeouts gelten, oder sind Sie kürzer? Mit einem großen sende-Puffer und eine langsame Verbindung, die Zeit, um tatsächlich alle gepufferten Daten könnten beträchtlich sein, nachdem alle.
Ich bin überhaupt nicht für Sie benachrichtigt werden, das Letzte byte gesendet; ich will nur diese zu kommen die auf dem remote-host, so zuverlässig wie möglich.
Application layer Bestätigungen sind keine option (das Protokoll ist HTTP, und ich Schreibe einen kleinen server).
InformationsquelleAutor der Frage lxgr | 2012-01-15
Du musst angemeldet sein, um einen Kommentar abzugeben.
Habe ich gelesen das ultimate SO_LINGER Seite viel. Ich empfehlen Sie Sie auch Lesen. Es beschreibt Grenzfälle bei der übertragung großer Datenmengen im Hinblick auf TCP-sockets.
Ich bin nicht der Experte bei SO_LINGER, aber auf meinem server code (noch in aktiver Entwicklung) ich Tue das folgende:
Nachdem das Letzte byte gesendet wird, über send(), rufe ich "shutdown(sock, SHUT_WR)" trigger ein FIN gesendet werden.
Warten Sie dann für eine spätere recv () - Aufruf auf diesem socket auf 0 zurück (oder recv -1 zurückgegeben und errno ist etwas anderes, EAGAIN/EWOULDBLOCK).
Dann der server hat ein close() auf den socket.
Ist die Annahme, dass der client in der Nähe seiner Steckdose zuerst, nachdem es empfangen hat, werden alle bytes der Antwort.
Aber ich habe ein timeout erzwungen, die zwischen dem letzten send() und bei recv() gibt an, EOF. Wenn der client schließt nie seine Ende der Verbindung, der server wird aufhören zu warten und schließen Sie die Verbindung sowieso. Ich bin bei 45-90 Sekunden für das timeout.
Alle meine Steckdosen sind nicht-blockierend und-ich verwende poll/epoll, um benachrichtigt zu werden, der Verbindung von Ereignissen als ein Hinweis zu sehen, wenn es Zeit ist zu versuchen, aufrufen von recv() bzw. send() wieder.
InformationsquelleAutor der Antwort selbie