Autor Beitrag
Cultrarius
Hält's aus hier
Beiträge: 1



BeitragVerfasst: Mi 11.02.09 11:41 
Hallo zusammen,

ich hab folgendes Problem: ich will eine Datei von einem PC, auf dem ein Java-Server läuft, an einen Client (der in C# geschrieben ist) schicken. Der Client hat einen Zähler, damit we weiß, wie viele Byte-Pakete er noch empfangen muss, bis die Datei vollständig ist. Das hier ist der Code-Ausschnitt, der interessant ist:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
while (pakete > 1024)
{
   reader.Read(puffer, 01024);
   datei.Write(puffer, 01024);
   pakete -= 1024;
}


Wenn ich die fertige Datei dann am Ende überprüfe, dann stimmt die Byte-Zahl exakt, aber leider steht zu großen Teilen Müll drin. Wenn ich die Quelldatei und die Zieldatei mit UltraEdit vergleiche, dann ist es so, dass in der Zieldatei immer wieder Blöcke einfach falsche Daten enthalten.
Außerdem liegen danach noch immer mehrere "Byte-Pakete" in meinem Socket. Also hat die Read-Funktion ja irgendwo noch ein paar Bytes aus dem Hut gezaubert...

Ich hab folgende 2 Lösungen gefunden, damit die Datei korrekt übertragen wird und im Socket keine Daten zurückbleiben:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
while (pakete > 1024)
{
   reader.Read(puffer, 01024);
   datei.Write(puffer, 01024);
   pakete -= 1024;
   System.Threading.Thread.Sleep(1); // Macht die Übertragung aber langsam
}


ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
while (pakete > 1024)
{
   puffer = reader.ReadBytes(1024);
   datei.Write(puffer, 01024);
   pakete -= 1024;
}


Kann mir bitte einer erklären, wie dieses Verhalten zustande kommt ?
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Mi 11.02.09 14:37 
BinarayReader.Read liest nur so viele Bytes ein, wie schon angekommen sind. Wie viele das sind, erfährst du über den Rückgabewert. ReadBytes dagegen wartet auf Input, bis er wirklich alle 1024 Bytes zusammen hat - oder am Ende des Streams angelangt ist. ReadBytes ist also blocking (nicht im Threading-Sinn), Read nicht.

_________________
>λ=