Sockets - Dateien verschicken
-
Guten Tag,
ich bin gerade dabei ein Programm zu schreiben dass über Sockets
Dateien verschickt. Allerdings stehe ich jetzt vor einem
Problem dass ich so einfach nicht lösen kann -.-Möglichkeit 1:
->Datei öffnen, Dateigröße bestimmen
->Dateigröße versenden
->Datei komplett in den RAM laden
->Buffer verschickenFunktioniert, (der kopiert Dateien sogar schneller als der
Explorer? oO^^) allerdings kann man so natürlich keine
sehr großen Dateien verschicken.Möglichkeit 2:
->Datei öffnen, Dateigröße bestimmen
->Dateigröße versenden
->Solange immer 1 byte aus Datei lesen und versenden bis Dateigröße erreichtFunktioniert auch, erzeugt allerdings 100% CPU last auf einem Kern.
Wie kann ich also effektiv Dateien versenden?
Besten Dank schonmal im voraus!
-
Sende nicht 1 Byte sondern immer in Blöcken von z.B. 1024 oder 2048 oder so.
-
Du solltest die Datei auf jeden Fall in Blöcken lesen, und nicht byteweise. D.h. du nimmst einen Buffer von, sagen wir mal 20 Byte und liest immer wieder so viel aus der Datei aus. Dabei solltest du allerdings immer die Rückgabewerte der Lesefunktion auswerten, die dir Aufschluß darüber geben wieviel Byte gelesen werden konnten.
Wenn die CPU dadurch immer noch zuviel ausgelastet ist, kannst du noch ein kurzes Sleep in die Schleife machen.
-
ANSI C kennt keine Sockets :p.
Das ganze ist sehr abhängig vom Betriebssystem. Unter Linux könntest du zB man: sendfile(2) oder zumindest man: mmap(2) nutzen.
Immer ein Byte(?!) zu lesen und zu senden, ist aber unter jedem Betriebssystem die schlechteste Variante!
-
Das ganze soll Betriebssystem unabhängig funktionieren,
deshalb kann ich leider keine OS-"Tricks" benutzenDas Problem beim blockweise senden ist, dass die Gegenseite
ja genau so viele bytes erwarten muss wie auch gesendet werden.Ich versuche gerade eine Lösung indem ich erst den "Rest" sende,
erst dann in die Schleife eintrete und den Hauptteil der Datei
blockweise sende.
-
Hm..
Ok, war doch einfacher als ich dachte
recv() kehrt ja auch zurück wenn nur IRGENDETWAS empfangen wurde,
und nicht erst wenn alle bytes empfangen wurden.Dadurch löst sich das Problem quasi von alleine
Besten Dank an alle!
-
Durch Ändern der Größe kannst du für deine Favoritenplattform und beliebige Dateigrößen deinen max. Durchsatz austesten.
Ansonsten ist das alles bis auf die Pseudofunktion C89 und somit max. portabel wie gewünscht.#define SENDSIZE 0x10000 unsigned char b[SENDSIZE]; fpos_t fp; size_t x; FILE *f=fopen("bla.bin","rb"); if( !f ) ... while( fgetpos(f,&fp), 1==fread(b,SENDSIZE,1,f) ) sendeanzahlbytes(b,SENDSIZE); fsetpos(f,&fp); x=fread(b,1,SENDSIZE,f); if(x) sendeanzahlbytes(b,x); fclose(f);
-
Dieser Thread wurde von Moderator/in rüdiger aus dem Forum ANSI 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.