6 Stimmen

Sieht NetworkStream.DataAvailable gepufferte Daten?

Weiß NetworkStream.DataAvailable, ob der Sendepuffer des Senders leer ist? Oder zeigt es einfach an, ob der Lesepuffer des Empfängers Daten enthält? Ich nehme an, dass letzteres der Fall ist...

Insbesondere für einige Socket-Arbeiten, die eine laufende Konversation, ich derzeit eine Länge-Präfix verwenden, so dass der Empfänger genau weiß, wie viele Daten in der aktuellen Charge ist; jedoch habe ich ein .patch, die ich NetworkStream.DataAvailable stattdessen verwenden gesendet. Meine Sorge ist, dass dies mir nur sagen wird, was der Empfänger bekommen hat - nicht was der Sender ursprünglich gesendet hat - aber ich bin kein Socket-Experte.

Liege ich falsch? Oder ist length-prefix der richtige Weg?

(beachten Sie, dass ich nicht einfach Read(), bis der Stream geschlossen ist, da mehrere Stapel auf der gleichen Verbindung gesendet werden, und es ist wichtig, dass ich jeden Stapel als separate behandeln; wenn ich zu viel in einem Stapel lesen (auch wenn es gepuffert und verworfen wird), dann wird die Konversation zu brechen).

5voto

Joel B Fant Punkte 23946

Eine Seite einer Verbindung wird nicht wissen, ob der Sendepuffer der anderen Seite leer ist.

DataAvailable zeigt nur an, ob Daten zu lesen sind. Sie könnten dies vor dem Read() aber das allein gibt Ihnen nicht die gewünschten Informationen. Sie verrät Ihnen nicht den Beginn und das Ende jeder Charge.

Ich habe bereits Hin- und Hergespräche kodiert und Längenpräfixe in den Daten verwendet. Ich habe Hilfsfunktionen geschrieben, die eine exakte Anzahl von Bytes lesen (Chunks auf einmal) und nicht mehr.

Die einzige Alternative zu den Werten für die Chargenlänge im Datenstrom ist eine Möglichkeit, die eingehenden Daten zu untersuchen und den Beginn und das Ende von Chargen zu erkennen.

0 Stimmen

Das habe ich mir auch gedacht. Dann werde ich den .patch höflich ablehnen und bei dem Längenpräfix bleiben. Prost.

2voto

Lounges Punkte 4676

Wenn Sie wissen müssen, wann der Empfänger alle Daten für eine bestimmte Nachricht erhalten hat, brauchen Sie auf jeden Fall ein Längenpräfix.

Normalerweise definiere ich eine Struktur ähnlich dieser, die am Anfang jeder binären Nachricht, die ich sende, erscheint.

struct Header
{
  int packetIdentifier;
  int protocolVersion;
  int messageType;
  int payloadSize;
}

Anhand des Identifikators können Sie feststellen, ob Sie eine gültige Nachricht Ihres Protokolltyps haben. Mit der Version können Sie Ihr Protokoll überarbeiten. Der Nachrichtentyp ist die Art der Nachricht (z.B.: CommsOnline). Die Größe der Nutzlast ist die Größe des Nachrichtentextes.

0 Stimmen

Danke; der Rest des Datenprotokolls ist bereits festgelegt (es ist eine Implementierung von Googles "Protokollpuffer"-Format) - aber ein nützlicher Beitrag.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X