Dies bei TCP-sockets schließen Sie automatisch nach einiger Zeit, wenn keine Daten gesendet werden?
Ich habe eine client-server-situation, wo der client öffnet einen TCP-socket an den server, und manchmal längere Zeit vergehen wird, mit der keine Daten gesendet zwischen Ihnen. Ich begegnet ein Problem, wenn der server versucht, Daten zu senden an den client, und es scheint erfolgreich zu sein, aber der client erhält nie, und nach ein paar Minuten, es sieht aus wie der client getrennt wird.
Brauche ich zum senden eine Art "keep alive" Paket jeder einmal in eine Weile?
Bearbeiten: Zu beachten, diese ist mit Gleichgesinnten auf dem gleichen computer. Der computer hinter einem NAT ist, dass nach vorne eine Reihe von ports auf diesem computer. Der client verbindet mit dem server öffnet die Verbindung über DNS. d.h. er verwendet das mydomain.net & port anschließen.
- u kann manuell legen Sie die timeout-Werte. In java die variable für es ist
SO_TIMEOUT
- In C wird die socket-option Konstante für eine Zeitüberschreitung beim Lesen ist SO_TIMEOUT. In Java rufen Sie die setSoTimeout () - Methode, aber auch dies setzt ein read timeout. Keiner von denen ist, was er zu Fragen.
- ich dachte, die setSoTimeout () - Methode setzt die variable SO_TIMEOUT.
- Natürlich tut es das. Aber das ist nicht, was Sie sagte. Es gibt keine SO_TIMEOUT an alle, die in Java, geschweige denn eine variable.
- Ich bezog mich auf docs.oracle.com/javase/1.4.2/docs/api/java/net/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Unter Windows sockets, die keine Daten gesendet haben, sind eine große Quelle für Probleme in vielen Anwendungen und muss richtig gehandhabt werden.
Das problem ist, dass SO_KEEPALIVE der Zeitraum kann eingestellt werden system-wide (andernfalls wird ein Standardwert ist nutzlos zwei Stunden) oder mit der späteren winsock-API.
Daher viele Anwendungen senden einige gelegentliche Daten-byte des ab und zu (nicht berücksichtigt werden die von der peer -) nur, um die Netzwerk-Schicht erklären Abschaltung nach ACK nicht empfangen wird (nachdem alle durch Weiterverbreitung erfolgt durch die layer-und ack-timeout).
Deine Frage zu beantworten: Nein, die buchsen, trennen Sie die Verbindung nicht automatisch.
Dennoch, Sie müssen vorsichtig sein mit dem oben genannten Problem. Was erschwert es weiter, dass die Prüfung dieses Verhalten ist sehr schwer. Zum Beispiel, wenn Sie alles richtig und Sie erwarten, zu erkennen, die Trennung richtig, Sie können nicht testen Sie es, indem Sie den physical layer. Dies ist, weil die NIC Sinn, dem Transportunternehmen einen Verlust und der socket layer-ein signal für alle Anwendungen zu schließen, sockets, auf ihn verlassen. Ein guter Weg, um es zu testen ist, verbinden Sie zwei Computer mit 3 Beinen und zwei switches dazwischen, trennen die mittleren Schenkel und verhindern so, dass Transportunternehmen einen Verlust, aber immer noch physisch trennen die Maschinen.
Gibt es einen timeout eingebaut, um TCP -, aber Sie können es anpassen, Siehe
SendTimeout
undReciveTimeout
des Socket-Klasse, aber ich habe eine suspiciouion, dass ist nicht dein problem. Ein NAT-router kann auch eine Ablaufzeit für TCP-verbindungen, bevor es entfernt von der port forwarding Tabelle. Wenn kein traffic in der Zeit des timeout auf dem router es blockiert alle eingehenden Datenverkehr (wie es deaktiviert die Weiterleitung von Informationen aus seinem Speicher, so dass es nicht weiß, was ein computer zu senden, die den Verkehr an), auch die ausgehende Verbindung wird wahrscheinlich eine andere Quell-port, so dass der server kann nicht erkennen, als die gleiche Verbindung.Es ist sicherer zu verwenden Keep-alive option (SO_KEEPALIVE unter linux), um zu verhindern, trennen, aufgrund von Inaktivität, aber diese erzeugen einige zusätzliche Pakete.
Dieser Beispielcode tun Sie es unter linux:
Grüße.
TCP-sockets nicht automatisch in der Nähe überhaupt. Jedoch TCP verbindungen tun. Aber wenn dies geschieht zwischen peers im selben computer die Verbindung sollte nie gelöscht werden, solange beide peers existieren, und Sie haben Ihre sockets öffnen.