Laden...

Dateitransfer mit AsyncCallback-Socket

Erstellt von Fabian vor 18 Jahren Letzter Beitrag vor 18 Jahren 1.088 Views
Fabian Themenstarter:in
1.985 Beiträge seit 2004
vor 18 Jahren
Dateitransfer mit AsyncCallback-Socket

Hallo Forum,

entschuldigt bitte, dass ich schon wieder ein Thread zu dem Thema aufmachen muss. Aber ich verzweifel jetzt mal so richtig. Ich bin jetzt schon so weit gekommen, ein Client-Server "Anwendung" zu schreiben, die Dateien über Sockets mit AsyncCallback-Methoden und einem ThreadPool verschickt. Soweit so gut dachte ich mir.

Beim Testen des Dateitransfers ist mir dann aber aufgefallen, dass unregelmäßig und immer an einem verschiedenen Punkt der Dateitransfer einfach so abbricht. Ich habe mal eine 500 MB Datei über die Verbindung verschickt und einmal brach der Transfer bei ca 100 MB, dann mal bei 200, 150, 300 und 50 MB einfach ab. Einmal lief er sogar komplett durch.

Das äußert sich so, dass der Transfer plötzlich etwas langsamer wird, bis er einen Punkt erreicht, wo der Transfer einfach abbricht. Ich erhalte auch überhaupt keine Fehlermeldung und die Verbindung besteht danach auch weiterhin. Beim Transfer mein ich auch kleinere Unterbrechungen festgestellt zu haben. Der Transfer an sich scheint etwas holprig zu sein.

Ich habe mal die beiden Projekte inkl. Source und Binaries an den Post gehangen. Um vom Client eine datei anzufordern, müsst ihr get_file <Verzeichnis><Datei> schreiben.

Die Datei wird in das Verzeichnis C:\Data\Test geschrieben. Das muss existieren oder ihr ändert es im Source.

Ich hoffe auf Eure Hilfe, da ich mir die ganze Sache nicht erklären kann und jetzt ungerne aufgeben würde, da ich doch schon recht weit gekommen bin.. finde ich 🙂.

Danke und Gruß,
Fabian

P.S.: Die Projekte sind mit #Develop erstellt. Ich hoffe ihr könnt da was mit anfangen.

"Eine wirklich gute Idee erkennt man daran, dass ihre Verwirklichung von vornherein ausgeschlossen erscheint." (Albert Einstein)

Gefangen im magischen Viereck zwischen studieren, schreiben, lehren und Ideen umsetzen…

Blog: www.fabiandeitelhoff.de

F
529 Beiträge seit 2003
vor 18 Jahren

Das ist zwar nicht die Lösung, aber ich würde keinen Threadpool verwenden.
Ein Threadpool kann nur 25 Threads verwalten und wird auch von Framework verwendet. Wenn du ihn also ewig blockierst, verhinderst du, dass andere Klassen die den Pool auch nutzen , diesen sofort verwenden können. Verwalte doch mal deine Threads selbst!

Außerdem würde ich die Datei nicht in einem Rutsch übertragen, sondern in vielen kleinen Stücken. Wenn dann nämlich mal ein Bruchstück nicht übertragen werden konnte, kannst du ja dafür sorgen, es erneut zu senden.

Deinen Source habe ich mir aber aus Zeitmagel nicht angesehen.

PS:
Wenn man die Asynronen Funktionen verwendet, wird dann automatisch dies ein einem neuen Thread ausgeführt? (Also die zu tätigende Aktion wie das übertragen?)

Besuchen sie das VisualC++ - Forum

Fabian Themenstarter:in
1.985 Beiträge seit 2004
vor 18 Jahren

Hallo,

naja. Mich nervt der ganze Socket Kram mittlerweile so richtig. Ich werd wohl wieder Syncrone Methoden benutzen und meine Threads selbst verwalten. Damit sollte es gehen.

Trotzdem danke für Deine Hilfe.

Gruß,
Fabian

"Eine wirklich gute Idee erkennt man daran, dass ihre Verwirklichung von vornherein ausgeschlossen erscheint." (Albert Einstein)

Gefangen im magischen Viereck zwischen studieren, schreiben, lehren und Ideen umsetzen…

Blog: www.fabiandeitelhoff.de

F
529 Beiträge seit 2003
vor 18 Jahren

Ich würde zwar schon asyncrone Methoden benutzen, aber es sein lassen, den Threadpool zu verwenden. Nimmst du eigentlich Sockets oder so TCPClients?
Übrigens gilt es nicht, dass es dich nervt.

Besuchen sie das VisualC++ - Forum

Fabian Themenstarter:in
1.985 Beiträge seit 2004
vor 18 Jahren

Original von Franknstein
Ich würde zwar schon asyncrone Methoden benutzen, aber es sein lassen, den Threadpool zu verwenden. Nimmst du eigentlich Sockets oder so TCPClients?

Ich benutze Sockets. Woran kann es denn liegen, dass mir der ThreadPool einen Strich durch die Rechnung macht?

Original von Franknstein
Übrigens gilt es nicht, dass es dich nervt.

Normalerweise würde ich dir Recht geben. Allerdings ist das gerade ein "Projekt", dass ich freiwillig und nur zum Spaß in meiner Freizeit mache. Da kann ich es schon sein lassen, wenn es mich nervt oder 🙂?
Will meine eh schon spärliche Freizeit nicht noch mit nervigen Dingen verbringen... da habe ich schon genug von 🙂.

Obwohl es bis zu diesem Zeitpunkt schon richtig Spaß gemacht hat, das zu programmieren.

"Eine wirklich gute Idee erkennt man daran, dass ihre Verwirklichung von vornherein ausgeschlossen erscheint." (Albert Einstein)

Gefangen im magischen Viereck zwischen studieren, schreiben, lehren und Ideen umsetzen…

Blog: www.fabiandeitelhoff.de

P
939 Beiträge seit 2003
vor 18 Jahren

Meiner Meinung nach macht es nicht viel Sinn, Threads lowlevel einzusetzen.

Es ist viel einfacher, die Logik für den Datentransfer ohne Threading zu programmieren und die Methode, die die Logik enthält, aus einem eigenen Thread heraus aufzurufen. Dadurch behält man obendrein die Wahl, ob die Ausführung synchron oder asynchron erfolgen soll.

Gruss
Pulpapex

// Edit: falls du das schon so machst, sry. Geht aus deiner Beschreibung nicht klar hervor.

Fabian Themenstarter:in
1.985 Beiträge seit 2004
vor 18 Jahren

Hallo,

ich habe jetzt noch etwas mit dem Client/Server gespielt und getestet. Jetzt werden die Daten komischerweise korrekt übertragen. Mehrere ca. 1,5 GB große Daten gingen ohne Probleme über die Leitung.
Naja, jetzt bin ich so richtig verwirrt 🙂.

Ich werd wohl ein Mischmasch aus beidem machen. Der Client bleibt auf jeden Fall bei Asyncronen Methoden. Den Server stelle ich wohl auf Syncrone um und verwalte meine Threads selber. Da finde ich das Handling einfacher.

Gruß,
Fabian

"Eine wirklich gute Idee erkennt man daran, dass ihre Verwirklichung von vornherein ausgeschlossen erscheint." (Albert Einstein)

Gefangen im magischen Viereck zwischen studieren, schreiben, lehren und Ideen umsetzen…

Blog: www.fabiandeitelhoff.de