[solved] QT4: Datei übers Netzwerk versenden mit Q3Socket

Alles rund um die Programmierung mit Qt
-=Freaky=-
Beiträge: 503
Registriert: 29. Dezember 2006 22:54
Wohnort: HL

Beitrag von -=Freaky=- »

ok das war es auch noch, aber danach ging es immer noch nicht.
mein fehler war, dass ich die dokumentation nicht gründlich genug gelesen habe und so einfach

Code: Alles auswählen

block.toBase64()
geschrieben habe, also wurde der block gar nicht verschlüsselt und die funktion hat ein kodiertes QByteArray ins nichts zurückgeliefert.
geändert habe ich es dann so

Code: Alles auswählen

QByteArray cryptedBlock = block.toBase64();
cryptedBlock += 'µ';
socket.writeBlock( cryptedBlock.data(), cryptedBlock.size() );
//edit: funktioniert immer noch nicht
warum auch immer, aber beim 1. test hat es funktioniert, auch das große bild (168kb) zu schicken. seit dem (nicht neu kompiliert, selbe exe-dateien) ist es fast dasselbe problem wie am anfang, bei der 4kb-datei ist es nie ein probem, aber bei größeren mit ein paar mehr kb oder mb tut sich beim server nichts, es kommt kein fenster zum speichern der datei auf.

ich wünsche schonmal euch allen einen guten rutsch und ein frohes und gesundes neues jahr (wird doch eh wieder nix :D)!

mfg,
julian
-=Freaky=-
Beiträge: 503
Registriert: 29. Dezember 2006 22:54
Wohnort: HL

Beitrag von -=Freaky=- »

ok, ich habe jetzt mal diese komische while-schleife, die ich immer noch nicht verstanden habe (die schleife schon, nur nicht den zweck hier), rausgenommen, sieht also so aus:

Code: Alles auswählen

void ClientSocket::readClient()
{   
   readBlock += readAll();
   int stop = readBlock.indexOf('µ');
   if (stop != -1)
   {
      QByteArray myData = readBlock.left(stop-1);
      writeFile( myData );
      readBlock.remove(0, stop+1);
   } 
   if( state() == Idle )
      deleteLater();
}
für mich vollkommen logisch und funktioniert auch besser,jetzt geht so gut wie alles (ich mache fortschritte :lol: ).
alle dateien werden gesendet und richtig empfangen, auch größere, bis auf ein paar iso-files. ich habe es nur mit iso-files ausprobiert, da das die einzigen dateien bei mir sind, die über 5 oder 10 mb groß sind. bei einer 50mb iso-file und einer 680mb iso-file liest der client die datei ein paar (ca. 2-4) minuten,
rechner arbeitet lautstark und dann hängt sich der client auf. unter windows kommt dann diese meldung "programm cl.exe musste beendet werden blablabnla...", wo man normalerweise einen fehlerbericht an M$ senden kann.
ich werde es heute noch unter meinem linux-system probieren, aber da ich das gerade zerschossen hatte musste ich das ganze zuerst unter dem windoof-testsystem machen.

naja, vielleicht weiss ja einer, warum der client immer abstürzt bei dateien ab 50mb (ich gehe nicht davon aus, dass es am format liegt, da alles iso-files). den client-code habe ich nicht weiter verändert.

mfg,
julian
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Dieser Code ist für so große Datenmengen nicht gedacht, außer du hast unbegrenzt Arbeitsspeicher zur Verfügung...
-=Freaky=-
Beiträge: 503
Registriert: 29. Dezember 2006 22:54
Wohnort: HL

Beitrag von -=Freaky=- »

ok,danke. an den arbeitsspeicher habe ich auch schon gedacht.
naja, wer schickt schon 50 oder mehr mb per chat-programm ??

rein theoretisch, wie würde man es lösen können, um so große datenmengen übertragen zu können? immer einen kleinen block lesen und schicken, in die datei schreiben, bestätigung zurück an den client, nächster block ... und am ende wieder ein steuerzeichen?

mfg,
julian
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Yep
-=Freaky=-
Beiträge: 503
Registriert: 29. Dezember 2006 22:54
Wohnort: HL

Beitrag von -=Freaky=- »

bin ich ja doch gar nicht so blöd :D

ok, dann hätten wir alles, vielen dank nochmal für eure hilfe und geduld mit mir!
ich habe einiges dazugelernt.
nur eine frage bzw. bitte hätte ich noch, damitich diese "warum verstehe ich das nicht"-gefühl wegbekomme:
könnte mir vielleicht nochmal jemand erklären wozu diese while-schleife da war? das mit dem "while( stop != -1 )" macht für mich irgendwie gar keinen sinn.
oder war das absichtlich und wirklich sinnfrei da reingesetzt, damit ich selber zum denken komme?

mfg,
julian
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Damit kannst du mehrere Blöcke auf einmal übertragen. Die while-Schleife sorgt dafür, daß der gesamte empfangene Datenblock in die Einzel-Blöcke aufgeteilt wird.
-=Freaky=-
Beiträge: 503
Registriert: 29. Dezember 2006 22:54
Wohnort: HL

Beitrag von -=Freaky=- »

achso ok. vielleicht stell ich mich blöd an, aber wie wird da das paket in die blöcke aufgeteilt?
und warum das "!= -1" ? stop ist doch ungleich -1, wenn das steuerzeichen gefudnen wurde, was aber nur beim letzten block der fall sein dürfte, und deshalb stimmt die if-bedingung ja auch, aber "während das steuerzeichen gefunden wird, suche nach dem steuerzeichen, falls es gefunden wurde, blabla.." ?

2. frage:
warum geht's dann ohne, aber nicht mit while-schleife?

mfg,
julian
uhu01
Beiträge: 150
Registriert: 10. Juli 2005 20:46

Beitrag von uhu01 »

Hy!

Es geht darum, das das Paket zerteilt wird, wenn du mehrere kleine Dateien überträgst und es sich so ausgeht das du mehrere Dateiende Zeichen im ByteArray hast wenn du es zerteilst und wieder zusammensetzt.

Deswegen aus != -1 da die Schleife dann läuft bis das Zeichen im String nicht gefunden wird. Es heist also....solange das Zeichen gefunden wird.

Das Fragmentieren übernimmt übrigens dein OS.

Warum es mit der while Schleife nicht geht kann ich dir nicht sagen, wirf foch einfach mal nen Debugger an, und schau dir an was passiert.

mfg
uhu01
-=Freaky=-
Beiträge: 503
Registriert: 29. Dezember 2006 22:54
Wohnort: HL

Beitrag von -=Freaky=- »

ok, jetzt habe ich es endlich auch verstanden!

vielen danke zum xten mal an euch für all die hilfe!

und nochmal...
danke!
mfg,
julian
uhu01
Beiträge: 150
Registriert: 10. Juli 2005 20:46

Beitrag von uhu01 »

-=Freaky=- hat geschrieben:ok, jetzt habe ich es endlich auch verstanden!

vielen danke zum xten mal an euch für all die hilfe!
Bitte gerne, dafür gibts so ein Forum doch.

mfg
uhu01
Antworten