1 00:00:00,000 --> 00:00:09,647 2 00:00:09,647 --> 00:00:11,730 SPEAKER:今すぐレッツダイブ 配布コードに 3 00:00:11,730 --> 00:00:14,470 と文脈を見てみましょう その内のコードがお書き 4 00:00:14,470 --> 00:00:15,780 オペレーティングされようとしている。 5 00:00:15,780 --> 00:00:17,350 一日の終わりに、 あなたが実装するつもりだ 6 00:00:17,350 --> 00:00:18,710 ウェブサーバーの全体。 7 00:00:18,710 --> 00:00:20,460 しかし、我々は提供してきた スケルトンとあなた 8 00:00:20,460 --> 00:00:24,090 いくつかの機能を持つコード、 特にネットワーキングに関連する。 9 00:00:24,090 --> 00:00:25,390 それでは見てみましょう。 10 00:00:25,390 --> 00:00:27,560 >> だから、ここまで上部に向かって ファイルの束である 11 00:00:27,560 --> 00:00:30,020 機能検査マクロの要件。 12 00:00:30,020 --> 00:00:33,570 さて、これはC、それだけの機能です manページの束に応じて 13 00:00:33,570 --> 00:00:36,410 あなたはのいくつかを定義する必要が これらの定数は真である 14 00:00:36,410 --> 00:00:39,920 またはそのので、さらに具体的な数字であると あなたは、特定の機能へのアクセスを持っている。 15 00:00:39,920 --> 00:00:42,470 それ以外の場合は宣言されていませんされます あなたがアクセスすることはできません。 16 00:00:42,470 --> 00:00:45,340 だから私は道によって、これをやった のmanページを読んで。 17 00:00:45,340 --> 00:00:48,410 さてダウン下に、中 ライン15〜17、我々 18 00:00:48,410 --> 00:00:50,550 宣言された制限値の全体の束を持っている。 19 00:00:50,550 --> 00:00:53,370 >> そして、我々はからこれらを借りてきた アパッチと呼ばれる人気のあるWebサーバー。 20 00:00:53,370 --> 00:00:54,650 これらはちょうどです 予定されている番号 21 00:00:54,650 --> 00:00:56,810 合計数をキャップに 許可されたバイト 22 00:00:56,810 --> 00:01:01,930 HTTP要求のための様々な文脈で ブラウザが私を送信することが許可されている。 23 00:01:01,930 --> 00:01:04,310 次に、オクテットを定義する。 24 00:01:04,310 --> 00:01:07,790 今、オクテットはちょうど空想の方法です バイト、または8ビットというのが。 25 00:01:07,790 --> 00:01:10,720 往年バイトで判明 必ずしも8ビットではなかった、 26 00:01:10,720 --> 00:01:12,339 そうオクテットは常に8ビットです。 27 00:01:12,339 --> 00:01:14,880 この場合には、我々は採用してきた 何ネットワーキングで一般的です 28 00:01:14,880 --> 00:01:17,410 オクテット8バイトを呼び出すの世界。 29 00:01:17,410 --> 00:01:21,840 >> ここで私はオクテットがすることを指定した その結果、多くの科学捜査のように、512であること 30 00:01:21,840 --> 00:01:24,170 私たちはの束を読んだとき ここにも、一度バイト、 31 00:01:24,170 --> 00:01:27,390 私たちは読みするつもりだ 当時のオクテットの束。 32 00:01:27,390 --> 00:01:28,922 ヘッダファイルの全体の束次。 33 00:01:28,922 --> 00:01:30,255 どのように私はこれらを含めるように知っていましたか? 34 00:01:30,255 --> 00:01:32,730 さて、私は単純に男を読む 関数の数のためのページ 35 00:01:32,730 --> 00:01:35,620 我々は、このディストリビューションで使用するだろうことを コー​​ドとは、ものに含める 36 00:01:35,620 --> 00:01:37,390 私がするように指示した。 37 00:01:37,390 --> 00:01:39,090 >> そして今、我々はデータ型を持っている。 38 00:01:39,090 --> 00:01:41,470 私たちは、charであることがオクテットを宣言した。 39 00:01:41,470 --> 00:01:44,040 そして、我々はそれがだと後で見る コー​​ド全体で使用。 40 00:01:44,040 --> 00:01:45,670 そして、我々は宣言した 試作品の全体の束、 41 00:01:45,670 --> 00:01:47,961 私たちはを素早く歩くよ これらの機能のそれぞれ。 42 00:01:47,961 --> 00:01:50,400 最後に、そしておそらく最も に維持することが重要 43 00:01:50,400 --> 00:01:52,520 この時点で念頭に置いて 物語は、そのあり 44 00:01:52,520 --> 00:01:54,520 実際には、全体である グローバル変数の束 45 00:01:54,520 --> 00:02:00,430 ファイルの先頭に、根、 CFD、SFD、要求、ファイルと体。 46 00:02:00,430 --> 00:02:03,960 >> さて、一般的に、グローバルな非常に多くのを使用して 変数、またはすべてのグローバル変数、 47 00:02:03,960 --> 00:02:05,280 バックの練習ではありません。 48 00:02:05,280 --> 00:02:09,090 しかし、それは、我々はまた、使用しているが判明 技術と呼ばれるシグナル処理後に 49 00:02:09,090 --> 00:02:11,930 に私たちを可能にするコード、で ユーザーが何かに当たったときに検出 50 00:02:11,930 --> 00:02:15,080 CTRL Cのような、シャットダウン 優雅にサーバー。 51 00:02:15,080 --> 00:02:18,240 そして優雅にそれを行うために、 そして実際に、メモリを解放 52 00:02:18,240 --> 00:02:20,800 我々は、へのアクセス権を持っている必要があります これらのグローバル変数。 53 00:02:20,800 --> 00:02:24,510 >> そして今、これのメインを見てみましょう このプログラムの全体を駆動します。 54 00:02:24,510 --> 00:02:27,720 まず、一番上にここに我々 エラー番号変数を持っている 55 00:02:27,720 --> 00:02:29,570 それはいないように見える タイプを持っているが、それはだ 56 00:02:29,570 --> 00:02:31,500 それは実際だから というファイルに定義されている 57 00:02:31,500 --> 00:02:34,800 エラーerrno.hをどの 高アップに含まれています。 58 00:02:34,800 --> 00:02:38,780 あなたが実際にをerrnoに男行うと この事の定義を参照してください。 59 00:02:38,780 --> 00:02:41,230 あなたは、これがあることがわかります 特別なグローバル変数こと 60 00:02:41,230 --> 00:02:43,350 全体の束によって設定されている 書かれていない関数の 61 00:02:43,350 --> 00:02:48,730 私達によってが、Linuxの作者によって 他のシステムは、実際に設定する 62 00:02:48,730 --> 00:02:52,400 その変数何かに数 あなたは世界的にできるように、うまくいかない 63 00:02:52,400 --> 00:02:54,830 間違って行ったのかを把握。 64 00:02:54,830 --> 00:02:58,540 >> 今、あなたは新しいが表示されますダウンの下に おそらくgetoptのを用いる技術、 65 00:02:58,540 --> 00:03:01,790 コマンドを解析するのに役立ち機能 ライン引数我々はしないように、 66 00:03:01,790 --> 00:03:05,540 考え出す時間を無駄に気にする必要があります 8080のようなものを解析する方法を、 67 00:03:05,540 --> 00:03:08,350 または助けを得るためにダッシュP、またはダッシュ時間。 68 00:03:08,350 --> 00:03:10,300 getoptのは、基本的に私たちのためにあることを行います。 69 00:03:10,300 --> 00:03:11,750 より多くのmanページを参照してください。 70 00:03:11,750 --> 00:03:13,960 >> 次に、我々は、エラーのビットを行う 確認するチェック 71 00:03:13,960 --> 00:03:17,420 ポート番号は以内であること スペックで指定された範囲。 72 00:03:17,420 --> 00:03:20,240 次に、我々は関数の呼び出しを参照してください。 その定義、我々はよ開始 73 00:03:20,240 --> 00:03:24,040 現時点で見て、その名の通り これは、Webサーバを起動し、示唆している。 74 00:03:24,040 --> 00:03:26,960 ここでは、関数の呼び出しを持っている と言うと呼ばれる信号、 75 00:03:26,960 --> 00:03:30,750 もし、あなたがからコントロールCを聞くとき ユーザーのキーボード、先に行くと、コール 76 00:03:30,750 --> 00:03:34,650 起こっているのハンドラと呼ばれる関数 物事を停止最終的にクリーンに 77 00:03:34,650 --> 00:03:35,500 サーバー。 78 00:03:35,500 --> 00:03:39,470 >> その下に見えるものです。 無限ループの最初の行 79 00:03:39,470 --> 00:03:41,660 効果的に呼び出しがある 呼び出された関数へ 80 00:03:41,660 --> 00:03:45,110 自分自身を私たちはどのリセット ために、後に実装する 81 00:03:45,110 --> 00:03:47,470 当社のグローバル状態の一部を解放する。 82 00:03:47,470 --> 00:03:50,480 それは、行になった後 コー​​ド条件付きで 83 00:03:50,480 --> 00:03:52,576 リターンをチェックしています 接続の値。 84 00:03:52,576 --> 00:03:55,700 述語のように今接続ルックス、 trueまたはfalseを返します何か。 85 00:03:55,700 --> 00:03:58,040 そして、それはありませんが、あります 接続で特別な何か 86 00:03:58,040 --> 00:03:59,960 その中には、ブロッキング呼び出しです。 87 00:03:59,960 --> 00:04:03,180 それはそこに座って待ちます ユーザーのブラウザになるまで 88 00:04:03,180 --> 00:04:05,860 このウェブに接続しようとする サーバーだけにして、それは意志 89 00:04:05,860 --> 00:04:10,160 私たちが進むように、trueまたはfalseを返す このif文の内側に。 90 00:04:10,160 --> 00:04:13,870 >> そこに一度、この機能に気づく 私たちが書いた解析と呼ばれる関数、 91 00:04:13,870 --> 00:04:17,230 すべて、オクテットのすべてを解析している ブラウザから来るバイトの 92 00:04:17,230 --> 00:04:21,010 サーバに、我々は、渡すことができるように 1にあなたが戻って最終的に値 93 00:04:21,010 --> 00:04:24,420 これらのグローバル変数のこと 店舗だけのバイトのすべて 94 00:04:24,420 --> 00:04:26,630 そののヘッダ リクエストではなく、体 95 00:04:26,630 --> 00:04:28,920 それに実際に身体があった場合。 96 00:04:28,920 --> 00:04:32,980 >> 今、私たちは始めダウンを下回る 抽出するために、これらのヘッダーを解析 97 00:04:32,980 --> 00:04:35,490 情報のサブセット 私たちは気にしていること。 98 00:04:35,490 --> 00:04:37,740 具体的には、あたり 仕様、まず我々 99 00:04:37,740 --> 00:04:40,580 である、ラインを要求したかった そのちょうどその最初の行 100 00:04:40,580 --> 00:04:45,710 うまくいけばGETのようなものを言う スラッシュまたはいくつかのパスした後、HTTP 1.1。 101 00:04:45,710 --> 00:04:48,150 我々は、この比喩を使用している 干し草の山で針の 102 00:04:48,150 --> 00:04:50,370 特定のを探すために 文字またはアドレス。 103 00:04:50,370 --> 00:04:53,120 そして実際、数があります 物流コード内の関数 104 00:04:53,120 --> 00:04:56,930 あなた、あまりにも、参考になること 特定の値を探していたとき。 105 00:04:56,930 --> 00:05:00,630 >> 最終的には、これらのバイトをコピーする ラインと呼ばれる変数に、 106 00:05:00,630 --> 00:05:03,510 あまりにもそのような通知は、我々はしました スタックに割り当て 107 00:05:03,510 --> 00:05:05,890 動的にサイズの配列を経由して。 108 00:05:05,890 --> 00:05:08,350 そして、我々は意図的にしようとしている malloc関数を呼び出す避けるために 109 00:05:08,350 --> 00:05:11,100 再びなぜなら、なぜなら コントロールCがあることの 110 00:05:11,100 --> 00:05:14,630 このプログラムの潜在的な特徴は、我々 急にこのコードを持ってしたくない 111 00:05:14,630 --> 00:05:17,479 ユーザー打撃によって中断 制御Cの結果 112 00:05:17,479 --> 00:05:20,270 私はチャンスを持っていない可能性があることです 無料で何かのために私がmallocさだ。 113 00:05:20,270 --> 00:05:23,660 だから私はできるだけ多くを使用しようとしている スタックの私はここにすることができますです。 114 00:05:23,660 --> 00:05:26,040 >> 次にドスへの全体の束、アップ。 115 00:05:26,040 --> 00:05:28,930 仕様は、詳しく説明するなり ここに期待だまさに上に、 116 00:05:28,930 --> 00:05:31,800 しかしコメントはあなたを与える 先にあるもののヒント。 117 00:05:31,800 --> 00:05:33,830 あなたに最初の必要性 要求行を検証 118 00:05:33,830 --> 00:05:37,760 そしてそれがどのように見えることを確認してください 仕様は、いわば、文法 119 00:05:37,760 --> 00:05:38,541 それはべきであると言う。 120 00:05:38,541 --> 00:05:41,290 その後、何かを抽出する必要が 外のもの、クエリと呼ばれる 121 00:05:41,290 --> 00:05:44,200 疑問符の後、のような 我々はGoogleの例で見た 122 00:05:44,200 --> 00:05:46,320 HDパラメータで渡しで。 123 00:05:46,320 --> 00:05:49,050 私たちは、その後一緒に連結 ウェブサーバのルート 124 00:05:49,050 --> 00:05:52,520 でのパスと その要求の最初の行 125 00:05:52,520 --> 00:05:56,010 との完全なパスを形成する ファイルには、私たちは、探したい。 126 00:05:56,010 --> 00:06:00,300 >> その後、我々は確認するつもりだ ファイルが存在し、読み取り可能であること。 127 00:06:00,300 --> 00:06:05,100 そして、我々はそのを抽出するつもりだ ファイル拡張子、.htmlのか.phpの、 128 00:06:05,100 --> 00:06:09,920 またはでのこのようないくつかの拡張機能 要求された文字列の最後の最後。 129 00:06:09,920 --> 00:06:11,940 次は、全体で 私たちが書いたコードの束 130 00:06:11,940 --> 00:06:15,800 実際にPHPを生成する あなたのためのコンテンツを生成した。 131 00:06:15,800 --> 00:06:18,010 一言で言えば、この コー​​ドは、名前を取り込み 132 00:06:18,010 --> 00:06:20,250 ファイルのあなたは、PHPが解釈したい。 133 00:06:20,250 --> 00:06:24,630 我々はと呼ばれるものでそれを渡す PHPのインタプリタにパイプ。 134 00:06:24,630 --> 00:06:28,060 ているかのように応答を取り戻す 応答は、ファイル自体た。 135 00:06:28,060 --> 00:06:32,110 そして、我々は、そのファイルのに対して繰り返し バイト、1バッファにそれらすべてを引っ張っ 136 00:06:32,110 --> 00:06:34,180 我々は最終的にできるように、 それらをプリントアウトする。 137 00:06:34,180 --> 00:06:37,230 >> これらの事実は、すべての DPRINTFこちらを呼び出し 138 00:06:37,230 --> 00:06:40,110 私たちは何かを印刷することができます ファイルディスクリプタと呼ばれる 139 00:06:40,110 --> 00:06:42,350 ちょうど整数です それはファイルを表します。 140 00:06:42,350 --> 00:06:45,360 精神が非常に似てますが、 ファイルとは根本的に異なる 141 00:06:45,360 --> 00:06:46,620 スターポインター。 142 00:06:46,620 --> 00:06:50,260 あなたのような構文を使用する方法に注目してください printfのここで私は動的にすることができるように 143 00:06:50,260 --> 00:06:54,000 長さのようなものを挿入 HTTPヘッダの値 144 00:06:54,000 --> 00:06:55,270 コンテンツ長と呼ばれる。 145 00:06:55,270 --> 00:06:57,990 そして、最終的に私が使用した 機能実際に書き込みする権利 146 00:06:57,990 --> 00:07:00,040 リクエストにボディ。 147 00:07:00,040 --> 00:07:03,750 >> 残念ながら、我々は唯一の実装 動的のサポート 148 00:07:03,750 --> 00:07:05,350 PHPファイルを生成した。 149 00:07:05,350 --> 00:07:08,520 我々はのサポートを実装していませんでした GIFは、およびJPEGのような静的ファイル、 150 00:07:08,520 --> 00:07:10,660 とCSSとHTMLファイル。 151 00:07:10,660 --> 00:07:14,450 これは、残念ながら、あなたに残され クライアントの目的に対応するため 152 00:07:14,450 --> 00:07:15,090 これは、することができません。 153 00:07:15,090 --> 00:07:20,050 だから、そこにあなたはそこだと見つけることができます そのブロック内の多くはないのインスピレーション、 154 00:07:20,050 --> 00:07:23,520 どのようにアップはできますが、少し高い場合 私たちは、PHPコードの解釈について行きました 155 00:07:23,520 --> 00:07:25,520 関数は、あなたが使用します 少し異なっている。 156 00:07:25,520 --> 00:07:27,561 >> 実際には、あなたが借りることができます 機能の一部 157 00:07:27,561 --> 00:07:29,620 おそらくフォレンジックから 問題のセット、なぜなら 158 00:07:29,620 --> 00:07:32,860 一日の終わりに、すべての作業を行う必要があり ここで行うあなたが何のファイルオープンを知っている回です 159 00:07:32,860 --> 00:07:35,690 あなたが知ったら、それはいわゆるだ MIMEタイプまたはコンテンツタイプ、 160 00:07:35,690 --> 00:07:39,040 あなたはそれらのバイトで読む必要がある と何とかそれらをバック吐き出す。 161 00:07:39,040 --> 00:07:41,190 >> そして、これの今ツアー ファイルの他の関数。 162 00:07:41,190 --> 00:07:43,820 最初にまで接続され、 単にtrueを返す 163 00:07:43,820 --> 00:07:47,350 ときに最終的に聞く ユーザーからの接続。 164 00:07:47,350 --> 00:07:48,786 次はエラーです。 165 00:07:48,786 --> 00:07:52,296 エラー、その間、関数我々として 異なる400のすべてを処理するために書いた 166 00:07:52,296 --> 00:07:55,360 500 HTTPステータス あなたが望むかもしれないコード 167 00:07:55,360 --> 00:07:58,500 ユーザーに戻って送信するために、 標準メッセージと一緒に。 168 00:07:58,500 --> 00:08:01,950 >> 次は特に、負荷である その目的は生活の中で肉の機能、 169 00:08:01,950 --> 00:08:06,920 ファイルのスターポインタから読むことです グローバルバッファへのファイルの内容 170 00:08:06,920 --> 00:08:09,000 私たちは、グローバルに宣言することを [上記の?メイン。 ?] 171 00:08:09,000 --> 00:08:12,649 これは、我々ので少し複雑です ファイルからバイトを読み込む必要が 172 00:08:12,649 --> 00:08:14,690 しかし各反復をチェック 我々はすでにきたかどうか 173 00:08:14,690 --> 00:08:17,600 ファイルの終わりを打つか、 何か他のものが間違ってしまった。 174 00:08:17,600 --> 00:08:21,210 そして、私たちはそのことを確認するのreallocを使用 私たちは成長しているを使用しているものは何でもバッファ 175 00:08:21,210 --> 00:08:24,440 と成長し、常に成長していると 先にバイト数の滞在 176 00:08:24,440 --> 00:08:25,675 我々はそこに収まる必要があること。 177 00:08:25,675 --> 00:08:27,550 ハンドラは、一方、ある 取得する機能 178 00:08:27,550 --> 00:08:30,630 を有するの方法によって呼び出さ 信号として制御Cを登録 179 00:08:30,630 --> 00:08:32,140 私たちは、傍受することを。 180 00:08:32,140 --> 00:08:34,070 ハンドラでここに注目してください そのそれ最終的に 181 00:08:34,070 --> 00:08:36,780 コー​​ルは、停止しているコースの Webサーバーを停止します。 182 00:08:36,780 --> 00:08:39,750 残念ながら、ルックアップ 実装されていません。 183 00:08:39,750 --> 00:08:41,940 精神で、これは かなりシンプルな機能。 184 00:08:41,940 --> 00:08:44,900 ファイル拡張子を考えると、必要 それは、いわゆるのMIMEを返すために 185 00:08:44,900 --> 00:08:46,320 タイプまたはコンテンツタイプ。 186 00:08:46,320 --> 00:08:49,260 そして、我々は仕様で指定する そのマッピングは何をする必要があります。 187 00:08:49,260 --> 00:08:52,330 しかし、あなたは翻訳する必要がある 最終的にCコードにそれ。 188 00:08:52,330 --> 00:08:56,490 >> 次は私たちの、同様に肉の機能です 生活の中でその目的は、パースと呼ばれる 189 00:08:56,490 --> 00:08:59,350 ていないファイルから、読むことです、 しかし、ネットワーク接続から。 190 00:08:59,350 --> 00:09:03,510 具体的には、読書と構文解析 ブラウザから来るのHTTPリクエスト 191 00:09:03,510 --> 00:09:05,940 そのため、サーバーへ 最終的に私たちは、解析することができます 192 00:09:05,940 --> 00:09:09,530 リクエスト内のヘッダーだけで ラインとあなたにそれらを返す 193 00:09:09,530 --> 00:09:12,720 そのグローバルバッファを経由して 我々は、[上に宣言された?メイン。 ?] 194 00:09:12,720 --> 00:09:14,880 >> その間、ある、リセット 私たちが定義する機能 195 00:09:14,880 --> 00:09:18,730 それを反復内側呼び出さ あなたが知っているメイン毎回の 196 00:09:18,730 --> 00:09:20,799 リスニングを開始する準備ができて 新しい接続のための 197 00:09:20,799 --> 00:09:22,840 私たちは常に知っているように、 私たちの変数の状態 198 00:09:22,840 --> 00:09:24,870 となるように私たちもきた その任意のメモリを解放 199 00:09:24,870 --> 00:09:28,070 のために割り当てられているかもしれません 以前のネットワーク接続。 200 00:09:28,070 --> 00:09:30,060 次は、スタートです 私たちが書いた機能 201 00:09:30,060 --> 00:09:31,920 それは全体が含まれています ネットワークコードの多く 202 00:09:31,920 --> 00:09:34,420 それは、最終的にWebサーバーを起動します。 203 00:09:34,420 --> 00:09:36,680 >> 最大最後の関数である これは、停止と呼ばれる 204 00:09:36,680 --> 00:09:38,770 まさにその、それを Webサーバーを停止します。 205 00:09:38,770 --> 00:09:42,270 しかし、最初に、それは任意のメモリを解放します それはまだ割り当てられています。 206 00:09:42,270 --> 00:09:45,850 しかし、それは最終的に出口を呼び出す でも、制御を戻すことなく、 207 00:09:45,850 --> 00:09:47,480 私たちの主な機能へ。 208 00:09:47,480 --> 00:09:49,480 最終的に、のいずれか 最も重要な技術 209 00:09:49,480 --> 00:09:52,680 このWebサーバを実装する場合である 試行錯誤のビットになるだろう、 210 00:09:52,680 --> 00:09:55,886 1つのブラウザウィンドウのオープンを持つ 右とでターミナルウィンドウで 211 00:09:55,886 --> 00:09:57,760 左、サーバコンソール 窓、そのので 212 00:09:57,760 --> 00:10:00,420 されたメッセージを見ることができます 画面上に表示されている。 213 00:10:00,420 --> 00:10:04,170 >> しかし、より良いまだ3番目になる ウィンドウ、第二ターミナルウィンドウ、 214 00:10:04,170 --> 00:10:07,135 これであなたは、Telnet、使用法を使用 そのための仕様で規定されている。 215 00:10:07,135 --> 00:10:09,640 そして、Telnetは非常にだけである シンプルなネットワークプログラム 216 00:10:09,640 --> 00:10:12,660 それはあなたがふりをすることができます 1ウィンドウ内のブラウザである 217 00:10:12,660 --> 00:10:14,540 他のウィンドウに話しながら。 218 00:10:14,540 --> 00:10:16,830 あなたが見ることができるこの方法 正確にテキスト形式のコマンド 219 00:10:16,830 --> 00:10:18,700 戻って来ていること サーバからクライアントへ 220 00:10:18,700 --> 00:10:20,810 突きすることなく Chromeの開発者の周りに 221 00:10:20,810 --> 00:10:24,010 そうでないツール clunkierインタフェース。 222 00:10:24,010 --> 00:10:29,099