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), um recv.
  • 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.

InformationsquelleAutor Hawk | 2014-09-03
Schreibe einen Kommentar