Datenfluss von Sockets optimieren
-
Also der Thread erklärt sich schon mit dem Titel....Wie kann ich den Datenfluss
von Sockets weiter optimieren/verschnellern? Ist das überhaupt möglich??
hier die typischen Sende/empfang Funktionen:für das senden:
int SendFile(char filepath[256], SOCKET sendsocket) { char buffer[1024]; long length; long rep; long rem; ifstream fin(filepath, ios::in|ios::binary); if(fin.fail()) return 1; fin.seekg (0, ios::end); length = fin.tellg(); fin.seekg (0, ios::beg); rem = length % 1024; length-=rem; rep = length / 1024; for(int i = 0; i < rep; i++) { fin.read(buffer,1024); send(sendsocket, buffer, sizeof(buffer), 0); } fin.read(buffer, rem); send(sendsocket, buffer, rem, 0); strcpy(buffer,"EOF"); send(sendsocket, buffer, sizeof(buffer), 0); fin.close(); return 0; } }
fürs empfangen:
void server_connection::GetFile(char directory[1024]) { std::ofstream out(directory, std::ios::out|std::ios::binary); //Datei binärisch zum schreiben öffnen int rc; //speichert die empfangenen Zeichen char buf[1024]; //speichert die binärischen Zeichen do { rc = recv(connectedSocket, buf, sizeof(buf), 0); //emfängt Zeichen und schreibt sie in den Buffer if(strcmp(buf,"EOF") != 0 && rc != 0) //wenn weder in dem buffer "EOF" steht noch null Zeichen //empfangen wurden { out.write(buf,rc); //...schreibt er in die Datei } }while(strcmp(buf,"EOF") != 0 && rc != 0); //läuft solange bis der "EOF" empfangen wurde und null //Zeichen empfangen wurden } }
-
Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum Rund um die Programmierung verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
a) sollte es schneller sein, wenn du die Datei sofort in den Speicher mapst (siehe man: mmap(2))
b) unter Linux und einigen Unices gibt es sendfile(2), mit dem das unnötige kopieren zwischen Kernel-/User-Space entfällt
c) könntest du die Packete komprimieren und so Netzlast sparen
d) würde ich die Länge der Datei (wenn es geht) vor dem versenden angeben und auch auf der Empfänger Seite die Datenbuffern und dann in einem rutsch auf die Platte schreiben
e) könntest du UDP anstelle TCP nehmen (wobei du deine eigene Sicherungsschicht implementieren müsstest)