SPEAKER:今すぐレッツダイブ 配布コードに と文脈を見てみましょう その内のコードがお書き オペレーティングされようとしている。 一日の終わりに、 あなたが実装するつもりだ ウェブサーバーの全体。 しかし、我々は提供してきた スケルトンとあなた いくつかの機能を持つコード、 特にネットワーキングに関連する。 それでは見てみましょう。 だから、ここまで上部に向かって ファイルの束である 機能検査マクロの要件。 さて、これはC、それだけの機能です manページの束に応じて あなたはのいくつかを定義する必要が これらの定数は真である またはそのので、さらに具体的な数字であると あなたは、特定の機能へのアクセスを持っている。 それ以外の場合は宣言されていませんされます あなたがアクセスすることはできません。 だから私は道によって、これをやった のmanページを読んで。 さてダウン下に、中 ライン15〜17、我々 宣言された制限値の全体の束を持っている。 そして、我々はからこれらを借りてきた アパッチと呼ばれる人気のあるWebサーバー。 これらはちょうどです 予定されている番号 合計数をキャップに 許可されたバイト HTTP要求のための様々な文脈で ブラウザが私を送信することが許可されている。 次に、オクテットを定義する。 今、オクテットはちょうど空想の方法です バイト、または8ビットというのが。 往年バイトで判明 必ずしも8ビットではなかった、 そうオクテットは常に8ビットです。 この場合には、我々は採用してきた 何ネットワーキングで一般的です オクテット8バイトを呼び出すの世界。 ここで私はオクテットがすることを指定した その結果、多くの科学捜査のように、512であること 私たちはの束を読んだとき ここにも、一度バイト、 私たちは読みするつもりだ 当時のオクテットの束。 ヘッダファイルの全体の束次。 どのように私はこれらを含めるように知っていましたか? さて、私は単純に男を読む 関数の数のためのページ 我々は、このディストリビューションで使用するだろうことを コー​​ドとは、ものに含める 私がするように指示した。 そして今、我々はデータ型を持っている。 私たちは、charであることがオクテットを宣言した。 そして、我々はそれがだと後で見る コー​​ド全体で使用。 そして、我々は宣言した 試作品の全体の束、 私たちはを素早く歩くよ これらの機能のそれぞれ。 最後に、そしておそらく最も に維持することが重要 この時点で念頭に置いて 物語は、そのあり 実際には、全体である グローバル変数の束 ファイルの先頭に、根、 CFD、SFD、要求、ファイルと体。 さて、一般的に、グローバルな非常に多くのを使用して 変数、またはすべてのグローバル変数、 バックの練習ではありません。 しかし、それは、我々はまた、使用しているが判明 技術と呼ばれるシグナル処理後に に私たちを可能にするコード、で ユーザーが何かに当たったときに検出 CTRL Cのような、シャットダウン 優雅にサーバー。 そして優雅にそれを行うために、 そして実際に、メモリを解放 我々は、へのアクセス権を持っている必要があります これらのグローバル変数。 そして今、これのメインを見てみましょう このプログラムの全体を駆動します。 まず、一番上にここに我々 エラー番号変数を持っている それはいないように見える タイプを持っているが、それはだ それは実際だから というファイルに定義されている エラーerrno.hをどの 高アップに含まれています。 あなたが実際にをerrnoに男行うと この事の定義を参照してください。 あなたは、これがあることがわかります 特別なグローバル変数こと 全体の束によって設定されている 書かれていない関数の 私達によってが、Linuxの作者によって 他のシステムは、実際に設定する その変数何かに数 あなたは世界的にできるように、うまくいかない 間違って行ったのかを把握。 今、あなたは新しいが表示されますダウンの下に おそらくgetoptのを用いる技術、 コマンドを解析するのに役立ち機能 ライン引数我々はしないように、 考え出す時間を無駄に気にする必要があります 8080のようなものを解析する方法を、 または助けを得るためにダッシュP、またはダッシュ時間。 getoptのは、基本的に私たちのためにあることを行います。 より多くのmanページを参照してください。 次に、我々は、エラーのビットを行う 確認するチェック ポート番号は以内であること スペックで指定された範囲。 次に、我々は関数の呼び出しを参照してください。 その定義、我々はよ開始 現時点で見て、その名の通り これは、Webサーバを起動し、示唆している。 ここでは、関数の呼び出しを持っている と言うと呼ばれる信号、 もし、あなたがからコントロールCを聞くとき ユーザーのキーボード、先に行くと、コール 起こっているのハンドラと呼ばれる関数 物事を停止最終的にクリーンに サーバー。 その下に見えるものです。 無限ループの最初の行 効果的に呼び出しがある 呼び出された関数へ 自分自身を私たちはどのリセット ために、後に実装する 当社のグローバル状態の一部を解放する。 それは、行になった後 コー​​ド条件付きで リターンをチェックしています 接続の値。 述語のように今接続ルックス、 trueまたはfalseを返します何か。 そして、それはありませんが、あります 接続で特別な何か その中には、ブロッキング呼び出しです。 それはそこに座って待ちます ユーザーのブラウザになるまで このウェブに接続しようとする サーバーだけにして、それは意志 私たちが進むように、trueまたはfalseを返す このif文の内側に。 そこに一度、この機能に気づく 私たちが書いた解析と呼ばれる関数、 すべて、オクテットのすべてを解析している ブラウザから来るバイトの サーバに、我々は、渡すことができるように 1にあなたが戻って最終的に値 これらのグローバル変数のこと 店舗だけのバイトのすべて そののヘッダ リクエストではなく、体 それに実際に身体があった場合。 今、私たちは始めダウンを下回る 抽出するために、これらのヘッダーを解析 情報のサブセット 私たちは気にしていること。 具体的には、あたり 仕様、まず我々 である、ラインを要求したかった そのちょうどその最初の行 うまくいけばGETのようなものを言う スラッシュまたはいくつかのパスした後、HTTP 1.1。 我々は、この比喩を使用している 干し草の山で針の 特定のを探すために 文字またはアドレス。 そして実際、数があります 物流コード内の関数 あなた、あまりにも、参考になること 特定の値を探していたとき。 最終的には、これらのバイトをコピーする ラインと呼ばれる変数に、 あまりにもそのような通知は、我々はしました スタックに割り当て 動的にサイズの配列を経由して。 そして、我々は意図的にしようとしている malloc関数を呼び出す避けるために 再びなぜなら、なぜなら コントロールCがあることの このプログラムの潜在的な特徴は、我々 急にこのコードを持ってしたくない ユーザー打撃によって中断 制御Cの結果 私はチャンスを持っていない可能性があることです 無料で何かのために私がmallocさだ。 だから私はできるだけ多くを使用しようとしている スタックの私はここにすることができますです。 次にドスへの全体の束、アップ。 仕様は、詳しく説明するなり ここに期待だまさに上に、 しかしコメントはあなたを与える 先にあるもののヒント。 あなたに最初の必要性 要求行を検証 そしてそれがどのように見えることを確認してください 仕様は、いわば、文法 それはべきであると言う。 その後、何かを抽出する必要が 外のもの、クエリと呼ばれる 疑問符の後、のような 我々はGoogleの例で見た HDパラメータで渡しで。 私たちは、その後一緒に連結 ウェブサーバのルート でのパスと その要求の最初の行 との完全なパスを形成する ファイルには、私たちは、探したい。 その後、我々は確認するつもりだ ファイルが存在し、読み取り可能であること。 そして、我々はそのを抽出するつもりだ ファイル拡張子、.htmlのか.phpの、 またはでのこのようないくつかの拡張機能 要求された文字列の最後の最後。 次は、全体で 私たちが書いたコードの束 実際にPHPを生成する あなたのためのコンテンツを生成した。 一言で言えば、この コー​​ドは、名前を取り込み ファイルのあなたは、PHPが解釈したい。 我々はと呼ばれるものでそれを渡す PHPのインタプリタにパイプ。 ているかのように応答を取り戻す 応答は、ファイル自体た。 そして、我々は、そのファイルのに対して繰り返し バイト、1バッファにそれらすべてを引っ張っ 我々は最終的にできるように、 それらをプリントアウトする。 これらの事実は、すべての DPRINTFこちらを呼び出し 私たちは何かを印刷することができます ファイルディスクリプタと呼ばれる ちょうど整数です それはファイルを表します。 精神が非常に似てますが、 ファイルとは根本的に異なる スターポインター。 あなたのような構文を使用する方法に注目してください printfのここで私は動的にすることができるように 長さのようなものを挿入 HTTPヘッダの値 コンテンツ長と呼ばれる。 そして、最終的に私が使用した 機能実際に書き込みする権利 リクエストにボディ。 残念ながら、我々は唯一の実装 動的のサポート PHPファイルを生成した。 我々はのサポートを実装していませんでした GIFは、およびJPEGのような静的ファイル、 とCSSとHTMLファイル。 これは、残念ながら、あなたに残され クライアントの目的に対応するため これは、することができません。 だから、そこにあなたはそこだと見つけることができます そのブロック内の多くはないのインスピレーション、 どのようにアップはできますが、少し高い場合 私たちは、PHPコードの解釈について行きました 関数は、あなたが使用します 少し異なっている。 実際には、あなたが借りることができます 機能の一部 おそらくフォレンジックから 問題のセット、なぜなら 一日の終わりに、すべての作業を行う必要があり ここで行うあなたが何のファイルオープンを知っている回です あなたが知ったら、それはいわゆるだ MIMEタイプまたはコンテンツタイプ、 あなたはそれらのバイトで読む必要がある と何とかそれらをバック吐き出す。 そして、これの今ツアー ファイルの他の関数。 最初にまで接続され、 単にtrueを返す ときに最終的に聞く ユーザーからの接続。 次はエラーです。 エラー、その間、関数我々として 異なる400のすべてを処理するために書いた 500 HTTPステータス あなたが望むかもしれないコード ユーザーに戻って送信するために、 標準メッセージと一緒に。 次は特に、負荷である その目的は生活の中で肉の機能、 ファイルのスターポインタから読むことです グローバルバッファへのファイルの内容 私たちは、グローバルに宣言することを [上記の?メイン。 ?] これは、我々ので少し複雑です ファイルからバイトを読み込む必要が しかし各反復をチェック 我々はすでにきたかどうか ファイルの終わりを打つか、 何か他のものが間違ってしまった。 そして、私たちはそのことを確認するのreallocを使用 私たちは成長しているを使用しているものは何でもバッファ と成長し、常に成長していると 先にバイト数の滞在 我々はそこに収まる必要があること。 ハンドラは、一方、ある 取得する機能 を有するの方法によって呼び出さ 信号として制御Cを登録 私たちは、傍受することを。 ハンドラでここに注目してください そのそれ最終的に コー​​ルは、停止しているコースの Webサーバーを停止します。 残念ながら、ルックアップ 実装されていません。 精神で、これは かなりシンプルな機能。 ファイル拡張子を考えると、必要 それは、いわゆるのMIMEを返すために タイプまたはコンテンツタイプ。 そして、我々は仕様で指定する そのマッピングは何をする必要があります。 しかし、あなたは翻訳する必要がある 最終的にCコードにそれ。 次は私たちの、同様に肉の機能です 生活の中でその目的は、パースと呼ばれる ていないファイルから、読むことです、 しかし、ネットワーク接続から。 具体的には、読書と構文解析 ブラウザから来るのHTTPリクエスト そのため、サーバーへ 最終的に私たちは、解析することができます リクエスト内のヘッダーだけで ラインとあなたにそれらを返す そのグローバルバッファを経由して 我々は、[上に宣言された?メイン。 ?] その間、ある、リセット 私たちが定義する機能 それを反復内側呼び出さ あなたが知っているメイン毎回の リスニングを開始する準備ができて 新しい接続のための 私たちは常に知っているように、 私たちの変数の状態 となるように私たちもきた その任意のメモリを解放 のために割り当てられているかもしれません 以前のネットワーク接続。 次は、スタートです 私たちが書いた機能 それは全体が含まれています ネットワークコードの多く それは、最終的にWebサーバーを起動します。 最大最後の関数である これは、停止と呼ばれる まさにその、それを Webサーバーを停止します。 しかし、最初に、それは任意のメモリを解放します それはまだ割り当てられています。 しかし、それは最終的に出口を呼び出す でも、制御を戻すことなく、 私たちの主な機能へ。 最終的に、のいずれか 最も重要な技術 このWebサーバを実装する場合である 試行錯誤のビットになるだろう、 1つのブラウザウィンドウのオープンを持つ 右とでターミナルウィンドウで 左、サーバコンソール 窓、そのので されたメッセージを見ることができます 画面上に表示されている。 しかし、より良いまだ3番目になる ウィンドウ、第二ターミナルウィンドウ、 これであなたは、Telnet、使用法を使用 そのための仕様で規定されている。 そして、Telnetは非常にだけである シンプルなネットワークプログラム それはあなたがふりをすることができます 1ウィンドウ内のブラウザである 他のウィンドウに話しながら。 あなたが見ることができるこの方法 正確にテキスト形式のコマンド 戻って来ていること サーバからクライアントへ 突きすることなく Chromeの開発者の周りに そうでないツール clunkierインタフェース。