Laden...

TcpListener - große Datenpakete empfangen

Erstellt von moelski vor 12 Jahren Letzter Beitrag vor 12 Jahren 1.533 Views
M
moelski Themenstarter:in
183 Beiträge seit 2011
vor 12 Jahren
TcpListener - große Datenpakete empfangen

Moin !

Ich bräuchte mal einen Tip von euch zum Thema TcpListener und große Datenpakete.

Im Moment versuche ich eine CommandLine Log Console für SmartInspect zu schreiben. Als Grundlage nutze ich diesen threaded TCP Server:
Simple Threaded TCP Server

Ich kann auch schon mit der SmartInspect Lib "reden". Hier ist beschrieben wie das geht:
SmartInspect Log Formats and Protocols

Das ganze funktioniert schon ganz gut wenn es kleine TCP Pakete sind die komplett übertragen werden. Also wenn man z.B. einen String oder einen Wert loggt.
Wenn ich aber größere Datenmengen übertrage (z.B. eine Objektbeschreibung, XML Struktur, ...) dann klappt das nicht mehr problemlos.

Wenn ich das richtig sehe, dann liest diese Zeile hier:

bytesRead = clientStream.Read(message, 0, 4096);

max. 4096 Bytes vom Netzwerkstream, oder?
So steht es jedenfalls in der Hilfe:

The Read operation reads as much data as is available, up to the number of bytes specified by the size parameter

Nun frage ich mich aber was die beste Herangehensweise wäre. *Den Size Wert von 4096 rauf setzen auf z.B. 2000000. Ich denke größere Pakete werde ich nicht bekommen. *Die Größe des Datenpakets aus den ersten 4096 Byte auslesen und einen Buffer in der Größe einrichten. Dann alle neuen Pakete so lange anhängen bis der Buffer entsprechend gefüllt ist? Diese Variante erscheint mir recht kompliziert. *Generell aneres Vorgehen?! Evtl. über ClientStream.DataAvailable?

**Nachtrag ... **

Den Size Wert von 4096 rauf setzen auf z.B. 2000000.

Das klappt schon mal nicht 😃

Greetz Dominik

C
224 Beiträge seit 2009
vor 12 Jahren

Die Größe des Datenpakets (...) auslesen (...). Dann (...) Pakete so lange anhängen bis (...) Buffer (...) gefüllt ist oder Verbindung verloren geht.

Eine wirklich bessere/andere Vorgehensweise wüsste ich jetzt auch nicht.
Modifikation: Daten in einem Buffer schreiben, bis es nichts mehr zu lesen gibt.
Danach erst Buffer auswerten.

P
157 Beiträge seit 2010
vor 12 Jahren

Also bei mir ließt er auch mehr als 4096 Bytes.
Standartmäßig arbeite ich immer so, dass ich am Anfang die Länge der zu sendenden Daten send, und dann die länge der Daten. Mein Buffer wird dann mit den Daten gefüllt, er hat die entsprechende Größe.

M
moelski Themenstarter:in
183 Beiträge seit 2011
vor 12 Jahren

Moin !

Also bei mir ließt er auch mehr als 4096 Bytes.

Klar. Ich habe eben bei Read mal 2000000 angegeben. Dann liest er bei mir zwischen 20000-30000 Byte große Stücke vom Paket.

Standartmäßig arbeite ich immer so, dass ich am Anfang die Länge der zu sendenden Daten send, und dann die länge der Daten. Mein Buffer wird dann mit den Daten gefüllt, er hat die entsprechende Größe.

Hättest du davon evtl. den Code?

Greetz Dominik

P
157 Beiträge seit 2010
vor 12 Jahren

Client:


//lese länge aus daten
            byte[] lengthArr = new byte[4];
            int offset = 0;
            int i = 0;
            while (offset < lengthArr.Length)
            {
                offset += ns.Read(lengthArr, offset, lengthArr.Length - offset);                
            }
            //länge convertieren aus byteArray
            int length = BitConverter.ToInt32(lengthArr, 0);

            //Buffer der entsprechenden Größe
            byte[] buffer = new byte[length];
            offset = 0;

            //empfange buffer
            while (offset < length)
            {
                offset += ns.Read(buffer, offset, length - offset);
            }

M
moelski Themenstarter:in
183 Beiträge seit 2011
vor 12 Jahren

Danke 👍

Werde ich gleich mal testen.

Greetz Dominik

P
157 Beiträge seit 2010
vor 12 Jahren

Hier noch der Sender


//buffer mit Daten zum Senden gefüllt
byte[] buffer = null;

byte[] lengthArr = BitConverter.GetBytes(buffer.Length);

ns.Write(lengthArr, 0, 4);
ns.Write(buffer, 0, buffer.Length);

M
moelski Themenstarter:in
183 Beiträge seit 2011
vor 12 Jahren

Moin !

@PPK:
Das funktioniert sehr gut 👍

Vielen Dank für den Codeschnibbl 8)

Greetz Dominik