C で単純な HTTP サーバーを構築する必要があります。リンク?サンプル?
12 に答える
以下をご覧になることをお勧めします:クライアントとサーバーを書くための実践ガイド
増分ステップで実装する必要があるのは次のとおりです。
- 基本的な TCP ソケット レイヤーを実行します (ポートでリッスンし、クライアント接続を受け入れ、データを送受信します)。
- 一度に 1 行 (CRLF で区切られた) 要求を読み取ることができるように、バッファー リーダーを実装します。
- 一番最初の行を読んでください。メソッド、リクエスト バージョン、およびパスを解析します。
- 「Header: value」構文のヘッダー解析を実装します。折りたたまれたヘッダーを展開することを忘れないでください。
- リクエスト メソッド、コンテンツ タイプ、およびコンテンツ サイズを確認して、ボディがどのように読み取られるかを判断します。
- コンテンツ タイプに基づいてコンテンツのデコードを実装します。
- HTTP 1.1 をサポートする場合は、「100 Continue」、キープアライブ、チャンク転送などを実装します。
- 不完全なリクエストの検出、クライアントの最大数の制限などの堅牢性/セキュリティ対策を追加します。
- コードをシュリンクラップしてオープンソース化してください:)
tiny httpdをご覧になることをお勧めします。ゼロから作成する場合は、RFC 2616をよく読んでください。非常に低いレベルでネットワークにアクセスするには、BSD ソケットを使用します。
HTTP サーバーは概念的に単純です。
- リッスン用にポート 80 を開きます
- 連絡が取れたら、少し情報を収集します (主に取得します。残りは今のところ無視してかまいません)。
- リクエストをファイルリクエストに変換する
- ファイルを開き、クライアントに吐き出します
サポートしたいHTTPの量に応じて、より困難になります.POSTはもう少し複雑で、スクリプト、複数のリクエストの処理などです.
しかし、ベースは非常にシンプルです。
Mongoose (以前の Simple HTTP Daemon) はかなり優れています。特に、組み込み可能であり、Windows、Windows CE、および UNIX でコンパイルできます。
ポート 80 で TCP ソケットを開き、新しい接続のリッスンを開始し、これを実装します。目的によっては、ほとんどすべてを無視できます。最も簡単な方法として、ソケットにテキストを書き込むだけで、すべての要求に対して同じ応答を送信できます。
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 ドライブに保存しました。コードのダウンロードは次のとおりです。
@ ankushagarwalはいくつかの変更を加え、彼のバージョンを GitHub にアップロードしました: https://github.com/ankushagarwal/nweb
私はあなたが使用できる私自身を書きました。これは sqlite を備え、スレッドセーフであり、C++ for UNIX で動作します。
それを分解して、C 互換コードを使用できるはずです。
lighthttpdのようなもののソースを見ることをお勧めします。
http://www.manning.com/hethmon/ -- Manning の「Paul S. Hethmon による HTTP の図解ガイド」は、HTTP プロトコルを学ぶのに非常に良い本であり、HTTP プロトコルを実装/拡張する人にとって非常に役立ちます。
より多くの回答を持つ重複があります。
まだ言及されていない候補の 1 つはspserverです。
プラットフォーム固有のソケット関数を使用して、HTTP プロトコルをカプセル化します。これは、 Apacheの背後にいる人が行ったのと同じです。