1 00:00:00,000 --> 00:00:09,647 2 00:00:09,647 --> 00:00:11,730 演講嘉賓:現在我們的潛水 入分配代碼 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 Web服務器的全部。 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,由此只是一個功能 根據一堆手冊頁 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 所以我用的方式做到了這一點 閱讀手冊頁。 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 >> 我們已經借了這些從 所謂的流行的Apache 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 原來在昔日一個字節 不一定八位, 26 00:01:10,720 --> 00:01:12,339 所以字節總是八位。 27 00:01:12,339 --> 00:01:14,880 所以在這種情況下,我們已經採取了 什麼是常見的網絡 28 00:01:14,880 --> 00:01:17,410 世界呼喚八個字節一個字節的。 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 我們已經宣布的字節是一個字符。 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 參見手冊頁了解更多。 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 到服務器,這樣我們就可以出手 你回到最終值一 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 是,我可能沒有機會 免費的東西我malloced。 113 00:05:20,270 --> 00:05:23,660 所以我想用盡可能多 堆棧的是我可以在這裡。 114 00:05:23,660 --> 00:05:26,040 >> 接下來,一大堆到DOS。 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 問號之後,像 我們看到我們的谷歌的例子 122 00:05:44,200 --> 00:05:46,320 在傳遞一個HD參數。 123 00:05:46,320 --> 00:05:49,050 然後,我們一起串聯 Web服務器的根 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 然後我們遍歷該文件的 字節,拉他們都到一個緩衝區 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 但它最終調用exit 甚至沒有返回控制 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 有一個瀏覽器窗口打開 在右側和在一個終端窗口 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 >> 但更好的是將第三 窗口中,第二個終端窗口, 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 可以讓你假裝 是在一個窗口中的瀏覽器 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 在另外的工具 笨重的接口。 222 00:10:24,010 --> 00:10:29,099