2016-04-03 55 views
1

ソケットを使用してファイルを転送することはできません。つまり、ファイルを転送することは可能ですが、サイズは常に異なります。転送のためのコードの断片がある:winsockによるファイル転送(C++)

FILE *inFile = fopen(this->FullDir, "r+b"); 
//FILE *outFile = fopen(this->DeskDir, "w+b"); 
if (inFile != 0) 
{ 
    char* buffer[16384]; //выделяем блок 16Кб 
    while (!feof(inFile)) //пока не конец файла 
    { 
     fread(buffer, 1, sizeof(buffer), inFile); //копируем блок 
     send(s, (char*)&buffer, sizeof(buffer), 0);//передаём блок 
    } 
} 

と受信用:

do 
{ 
    msg_len = recv(new_client_socket, (char*)&buffer, MAX_MESSAGE_LENGTH, 0); 
    fwrite(buffer, 1, sizeof(buffer), output); 
    } while (msg_len > 0); 

ファイルのサイズが2,50Mbあります。サイズは1MBから2,2Mbまで異なります。私のミスはどこですか?

+0

あなたは 'sizeof(buffer)'を書いていますか?つまり、サイズではなくバッファ全体のバイト数です。また、バッファが完全にいっぱいだとは思わない。 – AndyG

+0

私は 'fwrite'を参照しています – AndyG

+0

sizeof(バッファ)とMAX_MESSAGE_LENGTH(16384)を試しましたが、結果は常に同じです –

答えて

1

あなたのコードに必要な4つの修正があります

    送信者が関数freadの戻り値を取り、(当初は
  • 受信機ははsizeofの代わりにmsg_lenはバイトを書き込む必要があり、多くのバイトを送信する必要がある

  • バッファ)

  • 特に送信ソケットが非ブロッキングモードに設定されている場合、send()関数は1回の呼び出しですべてのデータを送信しないことがあります。 send()の戻り値を見て、データを送信してすべてのデータが送信されるまでバッファを進めるループを持つ必要があります。

  • ボーナスアイテムとして、&と(char )は、 "(char)& buffer"から送信者にキャストされます。 "buffer"はすでにバッファ内の最初のitgemのアドレスです。