2013-11-09 55 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(); 

Client code --------------------------------------- -

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

一個obi-wan,當然? –

回答

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

你的一個問題是,你總是發送緩衝區,即使你fread更少字節的1024個字節。 (請注意,1348656四捨五入至1024附近多是1349632.)

因此,在寫入側你想要的東西,如:

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

,並在讀出側你想要的東西,如:

while((fr_block_sz = recv(sock, Buffer2, 1024, 0)) >= 0) 
{ 
    // ... 
    int write_sz = fwrite(Buffer2, 1, fr_block_sz, fp); 

您的初始send也是有問題的,因爲您總是發送1024個字節而不檢查這是c_str返回的實際長度。

+0

如何檢查Buffer的長度?因爲如果我做sizeof(Buffer),它會返回我1024 ... – user2824788

+0

@ user2824788:這不是關於緩衝區的長度,而是讀取的字節數,這很重要,您已經將它存儲在'len'中。 –

+0

但是我不能發送'len'字節,因爲接收者不知道'len'。 我一直在想,一旦文件被下載,計算'垃圾'字節的數量並刪除它們。你對此有何看法? – user2824788

相關問題