C # - TcpClient - Ende des Streams erkennen?

8

Ich versuche, eine uralte Netzwerkkamera mit meinem Computer zu verbinden, und ich stehe bei einem sehr grundlegenden Problem fest - dem Erkennen des Endes des Streams.

Ich verwende TcpClient , um mit der Kamera zu kommunizieren, und ich kann tatsächlich sehen, wie die Befehlsdaten übertragen werden, hier keine Probleme.

%Vor%

Beim Zurücklesen der Antwort beginnt das Problem jedoch. Ich dachte zunächst etwas Einfaches wie das folgende Bit Code hätte funktioniert:

%Vor%

Aber das war es nicht, also hatte ich dieses Mal eine andere Version mit ReadByte (). Die Beschreibung besagt:

  

Liest ein Byte aus dem Stream und   schiebt die Position innerhalb der   um ein Byte streamen oder -1 zurückgeben   am Ende des Streams.

Ich dachte also, ich könnte etwas wie folgt umsetzen:

%Vor%

Nein, funktioniert immer noch nicht. Ich kann tatsächlich sehen, dass Daten reinkommen und nach einem bestimmten Punkt (der nicht immer derselbe ist, sonst hätte ich einfach so viele Bytes jedes Mal lesen können) Ich beginne, 0 als Wert für den Rest der Elemente zu erhalten, und das tut es nicht Ich halte an, bis ich die Ausführung manuell abbringe. So sieht es aus:

Also meine Frage ist, vermisse ich etwas Grundlegendes hier? Wie kann ich das Ende des Streams erkennen?

Vielen Dank,

H

    
Hamza 29.06.2011, 15:05
quelle

2 Antworten

14

Was Ihnen fehlt, ist, wie Sie an einen TCP-Datenstrom denken. Es ist eine offene Verbindung, wie eine offene Telefonleitung - jemand am anderen Ende kann oder darf nicht sprechen ( DataAvailable ), und nur weil sie pausierten, um Luft zu holen ( DataAvailable==false ), heißt das nicht, dass sie ' Re tatsächlich mit ihrer aktuellen Aussage fertig. Einen Moment später konnten sie wieder sprechen ( DataAvailable==true )

Sie müssen einige Regeln für das Kommunikationsprotokoll OBOVE TCP haben, das eigentlich nur eine Transportschicht ist. Vielleicht sendet Ihnen die Kamera beispielsweise eine spezielle Zeichensequenz, wenn die aktuelle Bildübertragung abgeschlossen ist. Sie müssen daher jeden gesendeten Charakter prüfen und feststellen, ob diese Sequenz an Sie gesendet wurde, und dann entsprechend reagieren.

    
The Evil Greebo 29.06.2011, 15:15
quelle
2

Nun, man kann EOS bei einer Netzwerkkommunikation nicht genau sagen (es sei denn, die andere Partei lässt die Verbindung fallen), normalerweise enthält das Protokoll selbst etwas, das anzeigt, dass die Nachricht vollständig ist (manchmal eine neue Zeile). Sie lesen also den Stream und füttern einen Puffer, und Sie extrahieren die vollständige Nachricht, indem Sie diese Strategien anwenden.

    
Felice Pollano 29.06.2011 15:10
quelle