2012-02-21 23 views
2

私はCで単純なWebサーバーを作成していますが、今は大きなファイルを転送する方法を解明しようとしています。私は40MBのファイルでこれをやろうとしていますが、セグメンテーションフォルトが発生しています(少なくともwgetが教えてくれることです!)cでソケットを使用して大きなファイルを送信する際に問題が発生しました

実際には、それは単に終了します、それは私がしようとすると、wgetを使用してファイルを取得するときに、それはsegフォールトでエラーが発生すると言います。ファイルを送信するコードは次のとおりです。

while(1) { 
    int bytes_read = fread(file_buffer, 1, BUFFER_SIZE, f); 
    printf("Bytes read: %d\n", i * 1024); 
    if (bytes_read == 0) { 
    if (logging > 0) { 
     printf("End of file reached...\n"); 
    } 
    break; 
    } else { 
    send(client, file_buffer, strlen(file_buffer), 0); 
if (logging > 1) { 
     printf("Buffer (%d): %s\n\n", bytes_read, file_buffer); 
    } 
    } 
    i++; 
} 

何か問題が起こっていますか?小さなファイルでもうまく動作しますが、これだけではありません。ああ、読み込むバイト数は、試行するたびに変わり、240000から770000になります。ありがとう!

+0

これは、バイナリストリームでstrlenを使用することはできません。最初の0バイトで停止します。あなたのsend呼び出しでbytes_readを使用していない理由はありますか? – Joe

答えて

1

freadはnull文字列を終了しません。 strlenではなくlength_readを長さパラメータとして使用して送信する必要があります。

また、文字列を印刷しようとする前にヌル終了するか、長さに%sフォーマッタを指定する必要があります。例:printf( "バッファ(%d):%。* s \ n \ n"、bytes_read、bytes_read、file_buffer);

+0

ねえ、私はこれらの修正をまだ役に立たないようにしました。私はまた、すべての印刷行をコメントアウトしようとしました。利用可能なメモリの問題かもしれませんか? –

+0

真剣にそれを疑う。より多くのコード、特にfile_bufferとBUFFER_SIZEの宣言と初期化を見せてください。また、fread()はintではなくsize_tを返しますが、このエラーは大きなファイルで発生すると言います。 size_tは、多くのプラットフォームでintと同じサイズではないことに注意してください。どんなOSとコンパイラを使用していますか、どのビットサイズをコンパイルしていますか? –

1

strlen(file_buffer)を使用して送信するバイト数を指定しないでください。これは多くの状況で壊れてしまい、送信されたファイルがあなたのバッファより大きい場合には常に破損します。 bytes_readを使用して送信するバイト数を指定するだけではどうですか?

+0

申し訳ありません、私のコードの古いバージョンからアップグレードしたのは間違いでした。私はそれをbytes_readに変更しましたが、問題はまだ続きますか? –

+0

@ Pete.Mertz:file_bufferをヌル終了文字列として出力しようとしていて、ヌル終了文字列ではないため、問題は解決しません。私はそれを修正する方法について私の答えに追加した編集を見てください。 –

関連する問題