Daten über Netzwerk-Sockets übertragen
-
Hallo!
Ich habe ein paar Fragen zu den QT Netzwerkfunktionen.
-
Gehe ich recht in der Annahme, dass wenn ich bei Sockets (konkret handelt es sich um QTcpSocket, aber das spielt ja denke ich keine Rolle) Daten per write() schreibe, diese irgendwo im QIODevice gecached werden und die Ausführung des Programms einfach weiter geht? Oder bleibt die Ausführung stehen, bis die Daten übertragen sind?
-
Ich will eine Datei von der Größe von maximal 30 MB übertragen. Soll ich die Datei einlesen und direkt in einem Stück schreiben? Oder soll ich sie häppchenweise an write() übergeben?
Dass die schon übertragenen Daten weg sind wenn die Verbindung abbricht ist mir klar, das ist aber auch kein Problem. -
ich hätte gerne, dass die Übertragung das normale Arbeiten nicht stört. Da sie absolut nicht eilt, hätte ich mir gedacht, dass ich einfach dir Geschwindigkeit drossle, das heißt eben nur 50 % der Bandbreite ausnutze.
Hier stellt sich natürlich die Frage, wie ich die vorhandene Bandbreite ermitteln kann. Das größere Problem ist, wie ich die Verbindung gedrosselt bekomme. Ich habe schon überlegt, einfach nur ganz wenige Bytes/Zeit per write() in den Socket zu schreiben, aber hier weiß ich noch nicht wie ich das realisieren könnte.
Vielen Dank für die Hilfe!
Tom
-
-
Tommm schrieb:
Hallo!
Ich habe ein paar Fragen zu den QT Netzwerkfunktionen.
- Gehe ich recht in der Annahme, dass wenn ich bei Sockets (konkret handelt es sich um QTcpSocket, aber das spielt ja denke ich keine Rolle) Daten per write() schreibe, diese irgendwo im QIODevice gecached werden und die Ausführung des Programms einfach weiter geht? Oder bleibt die Ausführung stehen, bis die Daten übertragen sind?
ja
Tommm schrieb:
- Ich will eine Datei von der Größe von maximal 30 MB übertragen. Soll ich die Datei einlesen und direkt in einem Stück schreiben? Oder soll ich sie häppchenweise an write() übergeben?
Dass die schon übertragenen Daten weg sind wenn die Verbindung abbricht ist mir klar, das ist aber auch kein Problem.
Ist afaik wurscht.
- ich hätte gerne, dass die Übertragung das normale Arbeiten nicht stört. Da sie absolut nicht eilt, hätte ich mir gedacht, dass ich einfach dir Geschwindigkeit drossle, das heißt eben nur 50 % der Bandbreite ausnutze.
Hier stellt sich natürlich die Frage, wie ich die vorhandene Bandbreite ermitteln kann. Das größere Problem ist, wie ich die Verbindung gedrosselt bekomme. Ich habe schon überlegt, einfach nur ganz wenige Bytes/Zeit per write() in den Socket zu schreiben, aber hier weiß ich noch nicht wie ich das realisieren könnte.
50% der Bandbreite ist schwieriger, da musst du zuerst die Bandbreite rausfinden. Drosseln ist leicht, einfach haepchenweise (siehe 2.) schicken. Fuer den Timer kannst du QTimer verwenden (der gibt alle x Millisekunden ein Signal, dieses verbindest du mit deinem Slot. Im Slot liest du zB 500kB aus der Datei und schreibst sie in den Socket. Die Streams (Datei und TCP) muessen dabei in der gleichen Klasse gespeichert werden (damit sie nicht jedes mal neu initialisiert werden).)
Keine Garantie, ich hab sowas noch nicht gemacht..