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インタフェース。