127

C で単純な HTTP サーバーを構築する必要があります。リンク?サンプル?

4

12 に答える 12

136

以下をご覧になることをお勧めします:クライアントとサーバーを書くための実践ガイド

増分ステップで実装する必要があるのは次のとおりです。

  1. 基本的な TCP ソケット レイヤーを実行します (ポートでリッスンし、クライアント接続を受け入れ、データを送受信します)。
  2. 一度に 1 行 (CRLF で区切られた) 要求を読み取ることができるように、バッファー リーダーを実装します。
  3. 一番最初の行を読んでください。メソッド、リクエスト バージョン、およびパスを解析します。
  4. 「Header: value」構文のヘッダー解析を実装します。折りたたまれたヘッダーを展開することを忘れないでください。
  5. リクエスト メソッド、コンテンツ タイプ、およびコンテンツ サイズを確認して、ボディがどのように読み取られるかを判断します。
  6. コンテンツ タイプに基づいてコンテンツのデコードを実装します。
  7. HTTP 1.1 をサポートする場合は、「100 Continue」、キープアライブ、チャンク転送などを実装します。
  8. 不完全なリクエストの検出、クライアントの最大数の制限などの堅牢性/セキュリティ対策を追加します。
  9. コードをシュリンクラップしてオープンソース化してください:)
于 2008-10-06T22:35:14.720 に答える
95

tiny httpdをご覧になることをお勧めします。ゼロから作成する場合は、RFC 2616をよく読んでください。非常に低いレベルでネットワークにアクセスするには、BSD ソケットを使用します。

于 2008-10-06T22:13:39.443 に答える
36

HTTP サーバーは概念的に単純です。

  • リッスン用にポート 80 を開きます
  • 連絡が取れたら、少し情報を収集します (主に取得します。残りは今のところ無視してかまいません)。
  • リクエストをファイルリクエストに変換する
  • ファイルを開き、クライアントに吐き出します

サポートしたいHTTPの量に応じて、より困難になります.POSTはもう少し複雑で、スクリプト、複数のリクエストの処理などです.

しかし、ベースは非常にシンプルです。

于 2008-10-06T22:15:34.510 に答える
29

Mongoose (以前の Simple HTTP Daemon) はかなり優れています。特に、組み込み可能であり、Windows、Windows CE、および UNIX でコンパイルできます。

于 2008-10-06T22:30:51.877 に答える
13

ポート 80 で TCP ソケットを開き、新しい接続のリッスンを開始し、これを実装ます。目的によっては、ほとんどすべてを無視できます。最も簡単な方法として、ソケットにテキストを書き込むだけで、すべての要求に対して同じ応答を送信できます。

于 2008-10-06T22:12:41.710 に答える
12

nweb (Nigel の Web サーバー) を見てください。

https://drive.google.com/file/d/0B3msld7qnNOhN1NXaFIwSFU2Mjg/view?usp=sharing&resourcekey=0-ngY0neP78dxJKlFv0PJoDQ http://www.ibm.com/developerworks/systems/library/es-nweb/

この記事には、疑似コード、説明、およびコメントが含まれています。

編集: IBM のリンクが無効になりました。ウェブページの PDF を Google ドライブに保存しました。コードのダウンロードは次のとおりです。

https://drive.google.com/file/d/0B3msld7qnNOhSGZGdDJJMmY0VHM/view?usp=sharing&resourcekey=0-xkbf4mv0gN1sZrhBjt86UQ

@ ankushagarwalはいくつかの変更を加え、彼のバージョンを GitHub にアップロードしました: https://github.com/ankushagarwal/nweb

于 2012-08-26T18:44:21.240 に答える
5

HTTP 仕様Firebug宿題でやる必要があったときに非常に役立ちました。

頑張ってください。:)

于 2008-10-06T22:38:50.143 に答える
5

私はあなたが使用できる私自身を書きました。これは sqlite を備え、スレッドセーフであり、C++ for UNIX で動作します。

それを分解して、C 互換コードを使用できるはずです。

http://code.google.com/p/mountain-cms/

于 2008-10-06T22:12:55.140 に答える
4

lighthttpdのようなもののソースを見ることをお勧めします。

于 2008-10-06T22:12:32.287 に答える
2

http://www.manning.com/hethmon/ -- Manning の「Paul S. Hethmon による HTTP の図解ガイド」は、HTTP プロトコルを学ぶのに非常に良い本であり、HTTP プロトコルを実装/拡張する人にとって非常に役立ちます。

于 2008-10-07T01:23:04.710 に答える
1

より多くの回答を持つ重複があります。

まだ言及されていない候補の 1 つはspserverです。

于 2009-12-30T07:17:40.043 に答える
1

プラットフォーム固有のソケット関数を使用して、HTTP プロトコルをカプセル化します。これは、 Apacheの背後にいる人が行ったのと同じです。

于 2008-10-06T22:13:26.310 に答える