0

ソケットを介して Linux サーバーから Windows クライアントにファイルを送信したいのですが、問題は、送信するよりも多くのバイトを受信することです。

サーバーコード ----------------------------------------------

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); 
}

ありがとう、

4

1 に答える 1

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

fread問題の 1 つは、バイト数が少なくても、常に 1024 バイトのバッファーを送信することです。(最も近い 1024 の倍数に切り上げた 1348656 は 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);

これがによって返されるものの実際の長さであることを確認せずに常に1024バイトを送信するため、イニシャルsendも問題がありますc_str

于 2013-11-09T11:54:53.847 に答える