Entwickler-Ecke

Netzwerk - File senden und empfangen


Tru5T - Mi 19.03.14 16:40
Titel: File senden und empfangen
Hey,

ich würde gerne mit C# ein File vom Client zum Server schicken. Mein Code funktioniert bisher allerdings nur mit Files die ca. 25MB groß sind.
Ich kann mir leider nicht erklären, warum diese Grenze meinem Code probleme bereitet... Vielleicht kann mir jemand von euch einen Tip geben?
Danke!

EMPFANGEN: (clientData, ist der NetworkStream)

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
using (FileStream fs = new FileStream(pathToTarget + received.Filename, FileMode.Create))
{
    int readCount = 0;
    //try as long as the whole file is written
    while (readCount < received.FileLength)
    {
        //reading and writing data
        if(clientData.DataAvailable)
        {
            Byte[] buffer = new Byte[1024];
            readCount += clientData.Read(buffer, 0, buffer.Length);
            if (readCount > received.FileLength)
            {
                long lastPart = received.FileLength - (readCount - buffer.Length);
                fs.Write(buffer, 0, (int)lastPart);
                break;
            }
            fs.Write(buffer, 0, buffer.Length);
        }
    }
    fs.Close();
    clientData.Close();
    //verify the file hash
    if (!received.getFileHash(pathToTarget + received.Filename).Equals(received.HashFile))
    {
        //delete the file because it has a error
        //File.Delete(pathToTarget + received.Filename);
        MessageBox.Show("File transmission failed! (File deleted!)");
                                    }
        //interrupt the infinite loop
        break;
    }


SENDEN:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
bytes = new Byte[1024];
//send the file
while (true)
{
    int readCount = fs.Read(bytes, 0, bytes.Length);
    nsStream.Write(bytes, 0, bytes.Length);
    if (readCount == 0)
    {
        break;
    }
}


Grüße
Tru5T

Moderiert von user profile iconTh69: Codeformatierung überarbeitet.


Th69 - Mi 19.03.14 17:18

Hallo und :welcome:

du solltest nur soviel senden, wie du auch im FileStream gelesen hast, also

C#-Quelltext
1:
nsStream.Write(bytes, 0, readCount);                    

Gleiches gilt beim Empfangen (so daß du hier eine lokale Variable benötigst):

C#-Quelltext
1:
2:
3:
int count = clientData.Read(buffer, 0, buffer.Length);
readCount += count;
fs.Write(buffer, 0, count);

Ob das die alleinige Ursache für dein 25MB Problem ist, kann ich allerdings nicht sagen.
Du hättest aber merken müssen, daß die Dateien inhaltlich nicht korrekt übertragen worden sind (z.B. an der Dateigröße)...


Tru5T - Do 20.03.14 14:48

Hey Th69,

danke für die schnelle Hilfe! Mein Problem wurde dadurch behoben!
Ich bin davon ausgegangen, dass der Buffer immer voll geschrieben wird und erst danach versendet...
Du hast recht die Dateien wurden nur bis 25MB korrekt übertragen alles was drüber war hatte einen ca. 800Byte großen null Block zwischen drinn, denn ich mir nicht erklären konnte...


Grüße
Tru5T