2016-11-25 10 views
0

Nehmen wir an, ich bin mit jemandem verbunden, der einen System.Net.Sockets.TcpClient verwendet. Ich sende ihnen eine Nachricht, dann rufe ich sofort TcpClient.Close(); Kann der andere Kunde die Nachricht erhalten? Ist das in den meisten TCP-Implementierungen auch richtig/falsch?TCP - Senden der Nachricht und Trennen der Verbindung

+1

Kurz gesagt - nein, es ist nicht garantiert (mit Ausnahme bestimmter Bedingungen/Verwendung) – Vlad

+0

Aus Neugier, warum TCP über UDP, wenn Sie eine Nachricht vom Typ Feuer & Vergessen haben wollen? – ColinM

+0

@ColinM - Ich mache eine Chat-Anwendung und habe versucht, den besten Weg zu finden, jemanden zu "treten". Ich hatte gehofft, der Server könnte eine Nachricht senden, dass die Person von X wegen Grund Y getreten wurde, dann sofort die Verbindung schließen und sie trennen. –

Antwort

1

Vlads Kommentar ist korrekt - die Lieferung kann nicht garantiert werden.

Angenommen, die TCP-Verbindung mit einem Peer ist hergestellt. Der Sendevorgang kopiert nur die Daten in den Netzwerkstapel im Betriebssystem, und es ist Aufgabe des Betriebssystems, sie zu senden. Die Sie rufen den Vorgang auf. OS hört nicht auf, die vorherigen Daten zu senden. OS verschiebt den Socket, bis Daten gesendet werden. Es ist vom Anwendungspunkt aus transparent.

Aber etwas falsches kann passieren. Der Peer kann abstürzen, das Netzwerk könnte ausfallen oder was auch immer. Obwohl das Betriebssystem versucht, Daten erneut zu übertragen, wenn TCP ACK nicht empfangen wird, kann die erneute Übertragung immer wieder fehlschlagen, bis OS aufgibt. Dieser allgemeine Mechanismus ist in allen Betriebssystemen, die das TCP-Protokoll implementieren, gleich.

Wenn Sie eine garantierte Zustellung benötigen, müssen Sie einen Mechanismus auf Anwendungsebene implementieren, um empfangene Daten zu bestätigen.

Verwandte Themen