ByteArray blockweise versenden und empfangen.

  • C#

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von Markus Jacobs.

    ByteArray blockweise versenden und empfangen.

    Hallo,

    ich möchte ein Byte Array in 2048 (kann auch geändert werden) Byte-Blöcken versenden.
    Folgendes Code Schnipsel hab ich mir dafür ausgedacht, jedoch funktioniert dieses nur solange die Datei welche in Bytes zerlegt wurde kleiner ist als der Buffer (2048 Bytes).
    Wenn Sie größer ist, kommt eine Array Out Of Bound Exception oder so ähnlich. Ich weiß auch was dies bedeutet, aber ich verstehe nicht wieso der Fehler kommt.
    Das Buffer-Array ist 2048 bytes groß. Ich kopiere meiner Meinung auch nie mehr bytes rein als eigentlich möglich. Könntet ihr da mal drüber schauen?

    C#-Quellcode

    1. FileStream fs = new FileStream("test.png", FileMode.Open);
    2. byte[] buffer = new byte[2048];
    3. int offset = 0;
    4. int bytesRead = fs.Read(buffer, offset, buffer.Length);
    5. while (true)
    6. {
    7. mSocket.Send(buffer, offset, bytesRead, SocketFlags.None);
    8. offset += bytesRead;
    9. if (offset >= fs.Length)
    10. break;
    11. int remaining = (int)fs.Length - offset;
    12. if(remaining > buffer.Length)
    13. bytesRead = fs.Read(buffer, offset, buffer.Length);
    14. else
    15. bytesRead = fs.Read(buffer, offset, remaining);
    16. }


    Danke im Voraus
    Der Fehler kommt sehr wahrscheinlich von hier: mSocket.Send(buffer, offset, bytesRead, SocketFlags.None);
    buffer = Buffer aus dem die Daten gesendet werden sollen
    offset = Index ab dem die Daten gelesen werden sollen
    bytesRead = Bytes die gelesen werden sollen

    Dein Buffer ist immer 2048 groß, also willst du immer alle Bytes vom 0-2047 Index verschicken.
    Nach jedem Senden vergrößert sich jedoch dein offset um 2048 was dann letztendlich so aussieht:
    mSocket.Send(buffer, 0, 2048, SocketFlags.None); Er liest 2048 Bytes vom 0 Index an
    mSocket.Send(buffer, 2048, 2048, SocketFlags.None); liest 2048 Bytes vom 2048 Index an, dein Buffer hat aber nur 2047 Indizes
    mSocket.Send(buffer, 4096, 2048, SocketFlags.None);

    Er versucht an einem Index zu lesen (2048 oder 4096, alles > 2047) der nicht vorhanden ist.
    Lösung:
    mSocket.Send(buffer, offset, bytesRead, SocketFlags.None); ---> mSocket.Send(buffer, 0, bytesRead, SocketFlags.None);
    Hmm, verstehe ich nicht, denn Offset gibt ja an ab wo er weiter senden will... Jetzt sendet er zwar ohne Fehler, jedoch ist mein PNG abgeschnitten... Es werden nur die ersten 2048 bytes übertragen hab ich das Gefühl.

    Anbei nochmal was ich jetzt zum Senden und zum empfangen habe:

    Edit: Hat jetzt geklappt, habs vergessen in der Send auch auf 0 zu setzen.
    Bilder
    • receive.PNG

      14,23 kB, 846×226, 111 mal angesehen
    • send.PNG

      27,23 kB, 613×354, 92 mal angesehen
    Wenn man von Hand zwischen Streams kopiert, sieht's eigentlich immer so aus:

    C#-Quellcode

    1. const int BufferSize = 2048;
    2. using (var Source = ...,
    3. var Target = ...) // Bei Streams immer using verwenden.
    4. {
    5. var Buffer = new Byte[BufferSize];
    6. int ReadBytes = 0;
    7. while ((ReadBytes = Source.Read(Buffer, 0, BufferSize)) != 0) // Solange Bytes gelesen wurden...
    8. {
    9. Target.Write(Buffer, 0, ReadBytes); // Schreibe die gelesenen Bytes in den ZielStream.
    10. }
    11. }

    Ich habe noch keine Situation gesehen, bei der man ein Offset ungleich 0 gebraucht hätte.
    Das Offset gibt nämlich den ersten Index im Puffer an. Hier gibt's keinen Grund, nicht am Anfang zu schreiben.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils