Senden Sie die binäre Datei über TCP/IP-Verbindung
Werde ich umformulieren, die ganze Frage hier, so dass es zu vertreten hat.
Ich bin in der Lage zu kopieren Binärdatei perfekt in der gleichen Maschine nicht über sockets, sondern nur eine einfache Kopie-Funktion. Zu versuchen, diesen code für das kopieren auf eine TCP/IP Verbindung, aber kann nicht ankommen es zu wirken.
FILE *filehandle = fopen("imagefile.jpg", "rb");
FILE *dest =fopen("imagecopy.jpg", "wb"); //copied image file
fseek(filehandle, 0, SEEK_END);
unsigned long filesize = ftell(filehandle);
char *buffer = (char*)malloc(sizeof(char)*filesize);
rewind(filehandle);
int bytesread = fread(buffer, sizeof(char), filesize, filehandle);
for( int i=0; i<filesize; i++ )
{
fputc(buffer[i], filehandle); //copies all the contents to dest
}
Den code oben funktioniert perfekt für das kopieren einer image-Datei im computer aber wenn umgesetzt, um die Kopie auf dem server, ist es schwierig, darüber zu gehen.
Ich bin versucht, senden Sie eine image-Datei von einer server zu einem client beiden denen gemacht wurden manuell in C. Die Länge der Datei, die vom server gesendet wurden, ist nur bekannt auf dem server, wenn es beim senden der Datei, damit der Puffer wird dynamisch generiert, in den server, so etwas wie dieses:
SERVER
fseek(filehandle, 0, SEEK_END);
long filesize = ftell(filehandle); //file could be 11000bytes
char *buffer = (char*)malloc(sizeof(char)*filesize); //char buffer with 11000 bytes to store the data from the file.
//then I call the send() function
rewind(filehandle); //go back to beginning
send(clientsocket, buffer, filesize, 0); //this is being sent perfectly, no errors because in the actual code, I am checking for errors
CLIENT
//here is where I don't understand how to dynamically allocate the 11000 bytes to store the data in a client buffer
//the filesize is not necessarily going to be 11000 so need to dynamically allocate
//I did the following:
#define BUFSIZE 10
FILE *filehandle = fopen("imagefile.jpg", "wb"); //image file created by client
char *buffer = (char*)malloc(sizeof(char)*BUFSIZE);
int bytesread = recv(buffer, 1, strlen(buffer), 0);
if( bytesread > 0 )
{
printf("Bytes read: %d\n", bytesread); //bytes read is 5
printf("Buffer: %s\n", buffer); //but buffer shows all the binary text like it normally would
//when I try to store buffer in a file, it doesn't put full buffer because only 5 characters are written
for( int i=0; i<bytesread; i++ )
{
fputc(buffer[i], filehandle); //this doesn't create full image
}
}
Wie kann ich dynamisch reservieren die 11000 bytes, die vom server gesendet?
- Sie Fragen sich, warum der code, den Sie nicht zeigen, nicht funktioniert?
- Undefiniertes Verhalten ist genau das – nicht definiert. Es ist nicht erforderlich, zum Absturz zu bringen.
- es ist unklar, warum Sie mit
printf("%s"
Anzeige einer Bild-Datei - und
sizeof bufffer
ist die Größe der Zeiger, nicht der Speicherblock, der es Punkte zu. - Dies ist nicht ganz das, UB, wenn er fixiert das
sizeof bufffer
Teil - es würde nicht wirklich überrannt, da der code übergeben, die Länge der kleinen zugewiesenen Puffer geändert wird (oder zumindest versucht), umrecv
. - Haben den server senden, die Größe der Datei erst, dann kann der client verwenden, um über die Größe des Puffers zuweisen.
- ich dachte an das, aber es ist nicht zur Arbeit gehen, weil dann würde ich noch zuteilen müssen die
char
für eingehende filesize Länge, die ich brauche, um zu wissen, die genaue Größe zu erhalten, die image-Datei korrekt über den server zum client. - WIRD es funktionieren. Sie NICHT (und SOLLTE NICHT) weisen einen einzigen Puffer zum senden/empfangen der gesamte Inhalt der Datei auf einmal. Insbesondere bei großen Dateien. Griff es fester Länge Blöcken statt. Auch die variable enthält die Dateigröße selbst behandelt werden können als in einem fixed-size-buffer. Siehe meine Antwort für ein Beispiel. Es sendet die Dateigröße gefolgt von der Datei, die Daten, liest dann die Dateigröße gefolgt von der Datei Daten.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Müssen Sie eine Schleife sowohl das senden und empfangen. Weder
send()
nochrecv()
sind garantiert zu senden/Lesen so viele bytes, wie von Ihnen gewünscht.Sollten Sie auch senden Sie die Größe der Datei, bevor die Datei Daten, damit der Empfänger weiß, wie viele bytes zu erwarten ist und Wann Sie aufhören zu Lesen.
Versuchen, so etwas wie dieses:
SERVER
CLIENT
Konnten wir vermeiden, die Kopfzeile, enthält das Bild der Größe, aber die, die wir gerade Lesen, um das Ende der gesendeten Daten. Über die Größe des Puffers, konnten wir eine Feste Zahl wie z.B. 10 * 1024, als wir einige Daten von dem server, wir speichern es in eine Datei entsprechend der tatsächlichen empfangenen Daten Länge.
@T. C: ich denke, wir können nicht reservieren eines Puffers entsprechend der Größe vom server gesendet, im Falle, dass das Bild zu groß zum speichern innerhalb der client-Speicher. Nicht zu erwähnen, der server ist fake, und bestimmt sind, um jeden Angriff.
LENGTH
Brocken, schreiben jedes chunkfp
, bis entweder das socket geschlossen ist oderrecv()
bricht mit einer Fehlermeldung ab. Das bedeutet, dass dieser code benötigt der Absender, um in der Nähe der Steckdose, wenn es geschieht, indem die Datei, ohne das senden der Datei die Größe vorher.