Frage

Ich habe ein Beispiel für einen Tcp Echo Server gelesen und einige Dinge sind mir unklar.

TcpClient client = null;
NetworkStream netStream = null;

try {
  client = listener.AcceptTcpClient(); 
  netStream = client.GetStream();

  int totalBytesEchoed = 0;
  while ((bytesRcvd = netStream.Read(rcvBuffer, 0, rcvBuffer.Length)) > 0) {
    netStream.Write(rcvBuffer, 0, bytesRcvd);
    totalBytesEchoed += bytesRcvd;
  }

  netStream.Close();
  client.Close();
} catch {
  netStream.Close();
}

Wenn der Server ein Paket (die while-Schleife) empfängt, liest er die Daten in rcvBuffer und schreibt sie in den Strom.

Was ich verwirrt, ist die zeitliche Reihenfolge der Nachrichten in der Kommunikation. Ist die Daten, die mit netStream.Write () unverzüglich an den Kunden geschrieben wurde (der auch noch das Senden sein kann), oder erst nach den Daten, die bereits in den Stream geschrieben wird (durch den Kunden) verarbeitet werden.

Die folgende Frage kann klären auch die vorherige: Wenn ein Kunde in den Stream durch das Schreiben einige Daten sendet, ist, dass die Daten an die Nachrichtenwarteschlange auf der Serverseite bewegt wartet so der Strom zu lesen ist eigentlich „leer“? Das würde erklären, warum der Server sofort streamen schreiben - weil die Daten, die aus dem Strom kommt tatsächlich an anderer Stelle gepuffert ...

War es hilfreich?

Lösung

. Hinweis: Die Methode aufrufen NetworkStream.Read wird in diesem Beispiel blockiert

Das Buch ist absolut richtig - roh Zugriff auf TCP-Streams bedeutet nicht, jede Art von extra „Chunking“ und in diesem Beispiel könnte zum Beispiel ein einzelne Byte leicht zu einem Zeitpunkt bearbeitet werden. Um jedoch das Lesen durchführt und in den Reihen (in der Regel mit sichtbaren Puffer) kann das Schreiben für eine effizientere Verarbeitung ermöglichen (oft als Folge von weniger Systemaufrufe). Die Netzwerkschicht und Netzwerk-Hardware auch dort eigene Formen der Puffer eingesetzt werden.

Es gibt tatsächlich keine Garantie, dass Daten von Write () geschrieben werden tatsächlich geschrieben werden, bevor mehr Liest () erfolgreich abgeschlossen ist: selbst wenn die Daten in einer Schicht gespült werden, bedeutet dies nicht, es in einer anderen gespült wird und es gibt absolut keine Garantie, dass die Daten ihren Weg zurück an den Auftraggeber über gemacht. Dies ist, wo höhere Protokolle ins Spiel kommen.

Mit diesem Echo Beispiel werden die Daten einfach durch so schnell geschoben, wie es sein kann. Sowohl das Schreiben und das Lesen werden von dem zugrundeliegenden Netzwerk-Stack basiert Block (die Sende- und Empfangspuffer insbesondere), das jeweils mit ihrer eigenen Reihe von Puffern.

[Dies vereinfacht die Dinge ein wenig natürlich -. Man immer auf der TCP [Protokoll aussehen könnte] selbst die Übertragungseigenschaften auf dem tatsächlichen Paketfluss erlegt]

Andere Tipps

Eine TCP-Verbindung ist im Prinzip, Vollduplex. So beschäftigen Sie mit zwei separaten Kanälen und ja, könnten beide Seiten zur gleichen Zeit mit dem Schreiben werden.

Sie haben Recht, dass technisch bei der Durchführung von Read () Operation, Sie sind nicht Bits aus dem Draht zu lesen. Sie lesen grundsätzlich gepufferten Daten (Chunks durch einen TCP und angeordnet in einer richtigen Reihenfolge empfangen wird). Beim Senden können Sie Flush (), die in der Theorie sollte sofort Daten senden soll, aber die modernen TCP-Stacks haben ein wenig Logik, wie die Daten in geeigneter Größe Paketen zu sammeln und zu platzen sie auf den Draht.

Als Henk Holterman erläutert, ist TCP ein Vollduplex-Protokoll (wenn von allen zugrunde liegenden Infrastruktur unterstützt), so das Senden und Empfangen von Daten ist mehr, wenn Sie Server / Client-Daten liest und schreibt. Es ist nicht so, wenn Sie Serverdaten senden, ein Client es sofort gelesen werden. Kunde kann seine eigene Daten werden zum Senden und führen Sie dann Read (), in diesem Fall Daten werden länger in Netzwerkpuffer bleiben und können nach einiger Zeit verworfen werden, niemand will es lesen. Wenigstens habe ich erlebt, wenn sie mit meinem supa dupa Server / Client-Bibliothek handelt (-.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top