C: senden Sie die Datei an Buchse
Ich versuche zu senden Binärdatei mit sockel.
FILE *file;
char *file_data;
file = fopen(filepath, "rb");
//Allocate memory
file_data=(char *)malloc(fileLen+1);
//Read file contents into buffer
fread(file_data, fileLen, 1, file);
fclose(file);
sent = send(client, file_data, strlen(header)+fileLen, 0);
Funktioniert es OK, aber einige Dateien zu groß und ich Lesen wollen, ein Teil zu Puffern, schicken Sie es, dann Lesen Sie im zweiten Teil, senden und so weiter.
Habe ich versucht, Teile zu bekommen mit fread und fgets, aber ich nicht = (, Wie es zu tun richtig?
UPD: das Problem war bei der Lektüre der eingehenden Anfrage vom client. Habe ich nicht gelesen. Wenn ich es mache, nichts schlimmes passiert
Sie brauchen, um uns zu zeigen, wie Sie haben versucht, sonst ist es schwer zu beantworten, warum Sie gescheitert. Es sollte nicht allzu schwer sein ...
Zeigen Sie uns, wie Sie waren, Taten Sie es mit fread und fgets, wir zeigen Ihnen, wie es funktioniert. Ich hätte gedacht, Sie könnten einfach anrufen fread, bis es wieder einen anderen Wert zu Ihr zählen, und in der gleichen Schleife schreiben in den socket.
Zeigen Sie uns, wie Sie waren, Taten Sie es mit fread und fgets, wir zeigen Ihnen, wie es funktioniert. Ich hätte gedacht, Sie könnten einfach anrufen fread, bis es wieder einen anderen Wert zu Ihr zählen, und in der gleichen Schleife schreiben in den socket.
InformationsquelleAutor spe | 2011-04-08
Du musst angemeldet sein, um einen Kommentar abzugeben.
Etwas wie:
Aber Sie müssen auch senden die Daten in Blöcken und nicht davon ausgehen kann, dass Sie senden Sie alle in einem Aufruf.
So, dass
send()
müsste mehr wie folgt Aussehen:Und dann muss man vorbereitet sein, um interrupts behandeln, während Sie die send () - Aufruf (in dem Fall müssen Sie einfach wiederholen Sie das senden von der gleichen position):
In die (hoffentlich seltenen) Fall von EINTR, die senden wiederholt auf die next-Schleife, iteration, und würde wahrscheinlich die chance haben, zu vervollständigen nächste Zeit und Daten zurückgeben, um Ihr Programm
fread
.....Darüber hinaus ist Sie die beste Netzwerk-Effizienz, die Sie aktivieren sollten, Nagle-Algorithmus (
TCP_NODELAY
) und/oderTCP_CORK
während derfread()
+send()
Schleife. Ermöglichen, packen alle die Daten der Datei in mehrere Netzwerkpakete wie möglich.InformationsquelleAutor Nick Dixon
Fread() in Blöcken
InformationsquelleAutor Sjoerd
Brauchen Sie nicht den Kopf, wenn Sie nur das senden einer Datei. Sie schließen einfach die TCP-Verbindung wenn Sie fertig sind senden und, wenn der client empfängt die EOF-dann werden Sie wissen, es ist EOF 😉
Vielleicht finden Sie auch diese Frage ALSO sehr erhellend:
Warum ist das schreiben einer geschlossenen TCP-socket schlimmer, als zu Lesen?
InformationsquelleAutor Robert S. Barnes
das Problem war bei der Lektüre der eingehenden Anfrage vom client. Habe ich nicht gelesen. Wenn ich es mache, nichts schlimmes passiert
InformationsquelleAutor spe