Sporadischer Fehler bei Dateiübertragung

  • C#
  • .NET 4.5

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Sporadischer Fehler bei Dateiübertragung

    Hej und guten Morgen,

    ich arbeite derzeit an einem Projekt dass die einfache Übertragung von Dateien zwischen 2 Netzwerk-PCs ermöglichen soll, ohne umständliche Windows Freigaben, zwischengeschaltete Server oder langsame USB Sticks.
    Das ganze basiert auf einer TCP Verbindung, in deren NetworkStream blockweise die Bytes der Datei reingeschrieben werden und die am anderen Ende einfach ausgelesen und in eine neue Datei gepackt werden.

    Die Methode zum Senden sieht in etwa so aus:

    Spoiler anzeigen

    C#-Quellcode

    1. using (var stream = new FileStream(controller.Transfer.FilePath, FileMode.Open, FileAccess.Read)) {
    2. using (var reader = new BinaryReader(stream)) {
    3. while (controller.BytesSent < controller.Transfer.FileSizeBytes) {
    4. var buffer = reader.ReadBytes(1048576);
    5. controller.BytesSent += buffer.Length;
    6. controller.Transfer.Connection.BinaryWriter.Write((byte) ProtocolCode.Data);
    7. controller.Transfer.Connection.BinaryWriter.Write(buffer);
    8. controller.Transfer.Connection.BinaryWriter.Flush();
    9. controller.ReportProgress();
    10. }
    11. }
    12. }
    13. controller.Transfer.Connection.BinaryWriter.Write((byte) ProtocolCode.End);
    14. controller.Transfer.Connection.BinaryWriter.Flush();


    Die Methode zum Empfangen sieht so aus:

    Spoiler anzeigen

    C#-Quellcode

    1. var stream = new FileStream(controller.Transfer.FilePath, FileMode.Create, FileAccess.Write);
    2. var writer = new BinaryWriter(stream);
    3. while (!stop) {
    4. try {
    5. if (controller.Transfer.Connection == null)
    6. continue;
    7. var code = (ProtocolCode) controller.Transfer.Connection.BinaryReader.ReadByte();
    8. if (code == ProtocolCode.End)
    9. break;
    10. var buffer = controller.Transfer.Connection.BinaryReader.ReadBytes(1048576);
    11. writer.Write(buffer);
    12. writer.Flush();
    13. controller.BytesSent += buffer.Length;
    14. } catch {
    15. break;
    16. }
    17. }
    18. GC.Collect();
    19. writer.Flush();


    Bei 9 von 10 Transferen funktioniert alles einwandfrei. Gestern jedoch wollten wir eine ca. 1,2GB große ISO Datei versenden, die sich am Ende nicht mehr öffnen lies.
    Heute habe ich es spaßeshalber nochmal mit einer ~530MB großer ZIP Datei versucht, deren Inhalt unversehrt blieb. Jedoch ist mir aufgefallen, dass die empfangene Datei 1 Byte größer ist. Ob dies bei der ISO auch der Fall war, kann ich aber nicht mehr sagen, da ich weder das Original, noch die Kopie besitze.



    Ich habe wirklich nicht den geringsten Schimmer woran das liegen könnte aber vielleicht hat ja jemand schon ein ähnliches Problem gehabt, oder sieht wo mein Fehler ist.

    Danke im Voraus
    Grüße
    Vainamo

    *Topic verschoben*

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    @Vainamo Probier es mal mit Large Packets:
    Netzwerk => Eigenschaften
    Adaptereinstellungen ändern
    Eigenschaften => Konfigurieren => Erweitert
    Eigenschaft: Großes Paket => Wert => Maximum auswählen
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    VB-Fragen über PN / Konversation werden ignoriert!
    @RodFromGermany die Option habe ich weder in den Einstellungen des WLAN Adapters, noch in denen der Netzwerkkarte.
    Meinst du es hat etwas mit der Größe der Blöcke zu tun?

    Grüße
    Vainamo
    @Vainamo Nur ein Versuch.
    Wir hatten mal Effekte mit neer TCP-Kamera, die lief danach besser.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    VB-Fragen über PN / Konversation werden ignoriert!
    @ErfinderDesRades ich schätze das kanns nicht sein, denn besagtes Byte müsste ja eigentlich nicht mehr im Buffer sein, nachdem es hier Sporadischer Fehler bei Dateiübertragung (Snippet 2/#9) gelesen wurde, oder?

    Grüße
    Vainamo
    ich glaub eher doch.
    in was du anführst liest du als erstes das ProtocolByte.
    Dassis schlecht, weil geschrieben haste es ja als letztes.
    daher denke ich, dass deine Lese-Schleife immer wegen Exception verlassen wird, und nicht wie du vermutlich denkst.
    Aber wenn man so TryCatcht kann man eiglich gar keine Aussagen über ein Programmverhalten machen
    TryCatch ist ein heißes Eisen
    @ErfinderDesRades Das ProtocolByte ist in dem Fall aber End, d.h. danach kommen gar keine Daten mehr, weswegen er die Schleife verlässt und den Empfangprozess beendet. Ich hab schon ohne das TryCatch das Debugging durchlaufen lassen, aber er wirft keine Exceptions. Das TryCatch ist auch nur dafür da, damit er den Vorgang abbricht, wenn die Verbindung verloren geht.

    Grüße
    Vainamo

    Vainamo schrieb:

    zwischen 2 Netzwerk-PCs
    Was passiert, wenn beide in einem Rechner laufen? Da kannst Du ja die Differenzen ggf. in eine Datei loggen.
    Gibt es da Unterschiede zwischen Debug und Release?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    VB-Fragen über PN / Konversation werden ignoriert!