2013-11-09 4 views
0

Я хочу отправить файл с сервера Linux на клиент Windows через сокеты, проблема в том, что я получаю больше байтов, чем я отправляю.Получение большего количества байтов, чем отправлено C++

Код сервера -------------------------------------------- -

if (resultEnviarLongitud = send(ClientSocket,GotFileSize.c_str(),1024,0)<0){ 
    cout<<endl<<"Error mandando la longitud! "<<endl; 
} 
rewind(fs); 

while ((len = fread(Buffer,1,1024, fs)) > 0) 
{ 
    if((resultEnviar = send(ClientSocket,Buffer,1024,0)) < 0){ 
     printf("ERROR: Failed to send file %s.\n", nombreArchivoADescargar.c_str()); 
     break; 
    } 
    sumEnviada+=len; 
} 

send(ClientSocket,"Hi",sizeof(Buffer),0); 


cout<<"Bytes enviados: "<<sumEnviada<<endl; 
strcpy(data, ""); 

cout<<endl<<"ARCHIVO MANDADO EXITOSAMENTE!"<<endl; 
rutaArchivoADescargar.clear(); 

Код клиента --------------------------------------- -

if (resultRecibirLongitud = recv(sock, Buffer, sizeof(Buffer), 0) > 0) 
{ 
    LongitudArchivo = atoi(Buffer); 
    cout<<endl<<"Longitud Archivo a Recibir: " <<LongitudArchivo<<endl; 
} 

FILE *fp=fopen("imagen.jpg","wb"); 
if (fp==NULL){ 
    cout<<"Error al crear archivo."<<endl; 
}else{ 
    bzero(Buffer2, 1024); 
    int fr_block_sz = 0; 
    int contador=0; 

    //shutdown(sock, SD_SEND); I HAVE TO USE IT? 

    while((fr_block_sz = recv(sock, Buffer2, 1024, 0)) >= 0) 
    { 
     if (fr_block_sz == 0) break; 
     if (strcmp (Buffer,"Hi") == 0) break; 
     int write_sz = fwrite(Buffer2, 1, 1024, fp); 
     if(write_sz < fr_block_sz) 
     { 
      printf("File write failed on server.\n"); 
     } 
     bzero(Buffer2, 1024); 
     contador+=fr_block_sz; 
     if (contador >= LongitudArchivo)break; 
     bzero(Buffer2, 1024); 
    } 
    cout<<endl<<"Numero de bytes recibidos: "<<contador<<endl<<endl; 
    if(fr_block_sz < 0) 
    { 
     printf("Error receiving file from client to server.\n"); 
    } 
    printf("Ok received from client!\n"); 
    fclose(fp); 
} 

Спасибо,

+0

Что вы отправили и что получили? –

+0

Я посылаю изображение 1348656 байт, и я получаю 1349632 байта Если я использую «shutdown (sock, SD_SEND)»; изображение выглядит как файл сервера, но имеет больший размер. Если я не использую «shutdown (sock, SD_SEND)»; изображение кажется поврежденным. – user2824788

+0

Оби-ван, конечно? –

ответ

3
while ((len = fread(Buffer,1,1024, fs)) > 0) 
{ 
    if((resultEnviar = send(ClientSocket,Buffer,1024,0)) < 0) 

Один из ваших проблем является то, что вы всегда отправить 1024 байт буфера, даже если вы fread меньше байтов. (Обратите внимание, что 1348656 округляется до ближайшего числа, кратного 1024 является 1349632.)

Таким образом, на стороне записи вы хотите что-то вроде:

while ((len = fread(Buffer,1,1024, fs)) > 0) 
{ 
    if((resultEnviar = send(ClientSocket,Buffer,len,0)) < 0) 

и на стороне чтения вы хотите что-то вроде:

Ваш начальный send также проблематичен, поскольку вы всегда отправляете 1024 байта без проверки того, что это фактическая длина того, что возвращается c_str.

+0

Любая идея, как я могу проверить длину буфера? Потому что, если я делаю sizeof (Buffer), он возвращает меня 1024 ... – user2824788

+0

@ user2824788: речь идет не о длине буфера, а о количестве прочитанных байтов, что важно, и вы уже храните это в 'len'. –

+0

Но я не могу отправить байты «len», потому что получатель не знает «len». Я думал о том, как только файл загрузится, вычислите количество байтов мусора и удалите их. Что ты об этом думаешь? – user2824788

Смежные вопросы