0

サーバーからクライアントにいくつかのファイルを送信したいのですが、問題があります。

サーバー sendfile コード:

    while ((len = fread(Buffer,1,sizeof(Buffer), fs)) > 0)
    {

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

クライアントの receiveFile コード:

    //shutdown(sock, SD_SEND); ???????

   do{
        recvVal = recv(sock, Buffer2, sizeof(Buffer2), 0);
        if (recvVal <= 0){
          printf("Can't read from socket");
          recvVal =0;
          fclose(fp);
          continue;
        }else{
            int off =0;
        do{        
          int write_sz = fwrite(Buffer2, 1, recvVal, fp); 
          if (write_sz < 0){
              printf("Can't write to file");
              fclose(fp);
              break;};    
          if (write_sz == 0) {cout<<endl<<"Nada que copiar"<<endl; break;}
           off += write_sz;
        }while(off<recvVal);

    bzero(Buffer2, 1024);
            contador+=off;
        }
    }while (contador<LongitudArchivo);
    cout<<endl<<"Numero de bytes recibidos: "<<contador<<endl<<endl;
printf("Ok received from client!\n");
fclose(fp);

SHUTDOWN(sock, SD_SEND) を使用しないと、期待されるすべてのバイトを受信しませんが、それを使用すると、さらにファイルを送信する方法がわかりません (ソケットの送信部分を起動する方法)。

ありがとう!

4

1 に答える 1

0

私はそれと何の関係があるのか​​ わかりませんshutdown()。いずれかの方法ですべてのバイトを受け取る必要があります。複数のファイルを送信する場合は、各ファイルの前に長さを送信し、ソケットから各ターゲット ファイルに正確にその数の後続のバイトを読み取る必要があります。

注意:recv()ゼロを返す場合は、ソケットを閉じてブレークする必要があります。-1 が返された場合はperror(),、ソケットを閉じてブレークするなどして、errno をログに記録する必要があります。

于 2013-11-10T22:53:09.530 に答える