-3

私は言う文字列を持っています

    char resp_buf[20000];

    sprintf(resp_buf,"HTTP/1.0 404 File not Found.\r\nContent-Type: text/html\r\\
n\r\n<html><body><h2>Error 404: The file your have requested does not exist.</h2\
></body></html>");

この後、後で send を呼び出します-->

send(fd,resp_buf,strlen(a),0);

データは送信されますが、サーバーがクラッシュし、セグメンテーション エラーが発生します。

ソケットプログラミングの send() で使用できるように、そのサイズをバイト単位で見つけるにはどうすればよいですか。セグメンテーション エラーが大量に発生します。strlen(a) と sizeof(a) を試しましたが、両方とも

セグメンテーション違反 (コアダンプ)

4

3 に答える 3

0

スタックに 20000 バイトを割り当てようとしています。まず、それがクラッシュの原因である可能性があります。バッファを割り当てるためのより良い方法を説明するつもりはありません。アプローチ全体が間違っているためです。

@mbratch は sizeof() について完全に間違っています。結果の文字列が常に正確に sizeof(resp_buf) バイトの長さであることをアプリオリに知る方法はありません。実際、投稿したコードは、それほど長くない文字列を作成します。したがって、これはいくつかのデータと大量のガベージを書き込みますが、これはおそらくあなたが望むものではありません.

(後で、おそらくマーケティングからの要求に応じて) このエラー HTML が変更されるとどうなりますか? コピーに対する考えが変わるたびに、プログラムを再コンパイルする予定ですか? それは私の楽しい考えではありません。「オープン コーディング」、別名「ハード コーディング」および「アンチ パターン」については Google で検索してください。

最初の引数が完全に制御できるフォーマット文字列でない場合は、printf ファミリの関数を使用しないでください。そうしないと、フォーマット文字列の脆弱性が発生する危険があります。それもグーグル。クラッカーはあなたのような人が大好きです。あなたの場合、それはフォーマット文字列ではなく定数文字列です。

おそらく、fdopen を使用して fd を FILE * に変換し、続いて fputs を使用して、ファイルからデータを取得するようなものが必要になるでしょう。しかし、実際には PHP や CMS などを使いたいと思っているでしょう。

ほんのわずかな C の知識だけで世界で最もくだらない Web サーバーを作成しようとしている理由を真剣に自問する必要があると思います。Apache は、ファイルを Web に提供するのに非常に優れています。

あなたが何を達成しようとしているのかを私たちに伝えることができなかったため、私たちはあなたがそれを避ける手助けをすることができません.

できれば、この質問にこれまで以上に反対票を投じます。

于 2013-09-13T13:25:00.690 に答える
0
int sprintf(char * restrict str, const char * restrict format, ...);

戻り値として出力されたバイト数を返します。それを使用してみてください。

または、常にあります

size_t strlen(const char *s);
于 2013-09-13T12:40:50.117 に答える
0

valgrind を使用してみてください。これは、メモリ リークと関連する動作を見つけるのに役立ちます。

http://valgrind.org/

于 2013-09-13T15:53:03.707 に答える