wxWidgets -> wxSocketBase: Übertragung sehr langsam.
-
Hallo,
Ich sitze zur Zeit an einem Problem mit der wxSocketBase.
Und zwar habe ich mir ein kleines Programm gebastelt, dass eine Datei einliest und diese über wxSocket überträgt.
Es funktioniert eigentlich auch soweit alles gut im loopback. Allerdings wenn ich das Tool über WAN übertragen lasse lässt die Übertragungsgeschwindigkeit sehr zu wünschen übrig (ca. 180kB/s) max. Upstream habe ich allerdings 6MBit zur Verfügung die ich hier auch gern nutzen würde.Hier einmal kurz der Codeausschnitt vom Senden:
char sendbuffer[1024]; wxFile tempfile; tempfile.Open(wxT("C:\\test.txt")); while(!tempfile.Eof()) { int len1 = tempfile.Read(sendbuffer, 1024); pClientSocket->Write(sendbuffer, len1); }
Über loopback bzw. über LAN auf einen anderen Rechner ist aber die Geschwindigkeit weitaus höher, allerdings auch nicht am Maximum.
Bei meinen Tests habe ich noch herausgefunden, dass wenn ich die Sendegröße pro Socket->Write erhöhe die Übertragungsgeschwindigkeit zu nimmt, was ich mir allerdings nicht wirklich erklären konnte.
Hängt das Problem mit der TCP Verbindung zusammen? Also dass die wx 1024 Bytes überträgt, danach auf die Quittierung des Datenempfangs von der Gegenseite wartet bevor das nächste Paket übertragen wird?
Und falls wirklich die Sendegröße hier das Problem darstellt, welche sollte man im besten Fall wählen?Ich hoffe Ihr könnt mir weiterhelfen.
Gruß
sKp.
-
Hat wxWidgets hierfür keinen Socketstream? Da sollte das dann evtl. besser gehen.
Es kann natürlich auch an der lesenden Seite liegen, und TCP wartet ja jeweils bis die Gegenseite den Emfang bestätigt...Du kannst natürlich auch über UDP versenden, musst dir dann nur ein Protokoll bauen, was die einzelnen Pakete simuliert...
-
Hi phlox81,
Erst einmal vielen Dank für deine Antwort!
Du hast natürlich Recht, dass das Problem auch von der lesenden Seite kommen könnte. Hier der Ausschnitt vom Empfangen:while(bRecv) { while(!pSocket->WaitForRead(10,0)){ Sleep(10); } BYTE filebuffer[1024]; pSocket->Read(filebuffer, 1024); if(!p_File.IsOpened()) { p_File.Create(wxT("C:\\test.txt"), true); p_File.Open(wxT("C:\\test.txt"), wxFile::write); } p_File.Write(filebuffer, recvlen); } p_File.Close();
Ich habe eben auch einmal nach einem Socketstream geschaut und es gibt anscheinend wirklich einen. Leider ist dieser nicht wirklich gut Dokumentiert
. Da ich aber noch recht neu auf dem Gebiet bin würde mich natürlich trotzdem interessieren, warum die Übertragungsgeschwindigkeit bei einem kleinen Paket (1024Bytes) so langsam ist - aber bei Größeren Paketen deutlich zunimmt.
Zum Thema UDP -> hier hätte ich allerdings das Problem wenn ich das richtig sehe, dass eventuell Pakete verloren gehen könnten und die Übertragene Datei dadurch unbrauchbar wird, es sei denn ich Bastel mir ein Protokoll, dass mit einer Checksumme zu jedem Paket antwortet (was im Endeffekt aber bei TCP ja schon vorhanden ist?)?
Wie oben schon geschrieben bin ich aber noch recht neu auf dem Gebiet und würde mich daher auch über Tipps und natürlich auch über Korrekturen freuen.
Gruß
sKp.
-
Bei meinen Tests habe ich noch herausgefunden, dass wenn ich die Sendegröße pro Socket->Write erhöhe die Übertragungsgeschwindigkeit zu nimmt, was ich mir allerdings nicht wirklich erklären konnte.
Weniger syscalls.
max. Upstream habe ich allerdings 6MBit zur Verfügung
Echt?
-
Hi knivil,
Danke dir auch erst einmal für deine Antwort.
Bist du dir sicher, dass es an den syscalls liegen könnte? immerhin läuft die übertragung im loopback sowie im LAN recht passabel (naja könnten auch mehr sein aber immerhin ca 2-6MB/s) erst über WAN tritt der große Geschwindigkeitsverlust auf (schwankend bei 150kb/s bei einer Paketgröße von 1024Byte, ca 770kb/s bei einer Paketgröße von 32768Byte - getestet über einen Tunnel auf meinem Root sowie testweise auch zu einem Kumpel) weswegen ich die syscalls eigentlich ausgeschlossen hatte. Oder habe ich hier einen Denkfehler?Und ja ich habe 6MBit Upstream zur Verfügung
.