Autor Beitrag
Tru5T
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Mi 19.03.14 16:40 
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)
ausblenden volle Höhe 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mi 19.03.14 17:18 
Hallo und :welcome:

du solltest nur soviel senden, wie du auch im FileStream gelesen hast, also
ausblenden C#-Quelltext
1:
nsStream.Write(bytes, 0, readCount);					

Gleiches gilt beim Empfangen (so daß du hier eine lokale Variable benötigst):
ausblenden 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)...

Für diesen Beitrag haben gedankt: Tru5T
Tru5T Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: 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