演講嘉賓:現在我們的潛水 入分配代碼 而看看上下文 在你的代碼編寫 將要被運行。 在一天結束時, 你要落實 Web服務器的全部。 但是,我們已經提供 你的骨架 碼具有一些功能, 特別是與網絡相關的。 讓我們一起來看看。 所以在這裡向頂部 該文件的是一串 功能測試宏要求。 現在,這是C,由此只是一個功能 根據一堆手冊頁 你必須定義一些 這些常數是真實的 或者甚至可以說具體的數字,這樣 您可以訪問特定的功能。 否則,他們將未申報 您將無法訪問。 所以我用的方式做到了這一點 閱讀手冊頁。 現在向下跌破,在 線15至17,我們 有一大堆宣布限制。 我們已經借了這些從 所謂的流行的Apache Web服務器。 而這些都只是 這將會號 封頂的總數 字節允許的 在各種情況下的HTTP請求 該瀏覽器允許給我。 接下來,我們定義字節。 現在,一個字節僅僅是一個奇特的方式 說法一個字節或8位。 原來在昔日一個字節 不一定八位, 所以字節總是八位。 所以在這種情況下,我們已經採取了 什麼是常見的網絡 世界呼喚八個字節一個字節的。 在這裡,我指定的字節會 是512,這樣,很像在取證 當我們讀到了一堆 在時刻字節,這裡也 我們要讀 束的八位位組的時間。 接下來一大堆的頭文件。 我怎麼知道要包括這些? 好吧,我只是看過的人 對於許多功能的網頁 我們將在這個配送使用 碼,並在那些包括 我奉命。 現在我們有一個數據類型。 我們已經宣布的字節是一個字符。 我們將在後​​面看到,這是 通篇使用的代碼。 我們已經申報了 一大堆原型, 我們將通過快速走 每個這樣的功能。 最後,也許是最 重要的是保持在 介意此時在 的故事,是有 是,實際上是一個整 一堆全局變量 在該文件的頂部,根, CFD,SFD,要求,文件和身體。 現在普遍使用這麼多全球 的變量,或者在所有的全局變量, 不是背面實踐。 但事實證明,我們也使用 技術,稱為信號處理後 在代碼中,這使我們能夠 當用戶點擊一些檢測 像CTRL C和關閉 服務器正常。 而為了做到這一點優雅 實際上釋放內存, 我們需要能夠訪問 這些全局變量。 現在讓我們來看看主要的,這 推動這一計劃的全部內容。 首先,在頂部在這裡,我們 有一個錯誤編號變量 出現不 有型,但是這 因為它實際上是 在一個名為文件中定義 錯誤errno.h中哪些 包括更高了。 如果你做男人的errno實際 看到這個東西的定義, 你會看到,這是一個 特殊的全局變量 由一大堆設置 功能沒有寫 通過我們,但被Linux的作者 與其他系統實際設置 一個數字,該變量的東西時, 出了問題,這樣你可以在全球 找出確實出問題。 現在,向下跌破,你會看到一個新的 技術也許使用getopt的, 一個功能,可幫助解析命令 行參數讓我們不 費心浪費時間搞清楚 如何解析類似8080, 或破折號p或破折號小時,得到幫助。 getopt的本質確實是我們。 參見手冊頁了解更多。 接下來,我們做了一點錯誤 檢查,以確保 該端口號是內 在指定範圍內的規範。 接下來,我們看到了一個調用函數 開始,他的定義,我們將 看看一個時刻,正如它的名字 顧名思義,這將啟動Web服務器。 在這裡,我們有一個函數調用 所謂的信號說, 如果當你聽到控制C來自 用戶的鍵盤,繼續打電話 一個函數調用的處理程序是怎麼回事 最終乾淨的東西和停止 服務器。 下面是這似乎是一個 無限循環,第一線,其中 有效的是一個電話 一個調用的函數 復位,這是我們自己 為了實施以後 釋放一些全球國家。 在這之後是一條線的 代碼有條件 被檢查返回 連接的價值。 現在,連看起來像一個謂語, 一些返回true或false。 而這樣做,但有 一些特殊的連接 因為它是一個阻塞調用。 它會坐在那裡,等待 直到用戶的瀏覽器 嘗試連接到該網絡 服務器,然後才將它 返回true或false,所以我們開始 這個if語句的內部。 一到那裡,看到這個功能了 函數調用的解析,這是我們寫的, 這解析所有的八位字節,所有的 從瀏覽器傳來的字節 到服務器,這樣我們就可以出手 你回到最終值一 這些全局變量的那 所有門店,在短短的字節 那頭 請求,而不是體 如果有一個真正的身體吧。 現在,向下跌破我們開始 解析這些頭提取 的信息的子集 我們所關心的。 具體地,每 規範中,我們首先 想請求線,這是 只是第一個行 希望說,類似的get 削減或某些路徑,然後HTTP 1.1。 我們使用這個比喻 在大海撈針的 尋找特定的 字符或地址。 事實上,還有一些 在我們的分銷代碼函數 你也可能會發現有用 尋找特定值時。 最終,我們複製這些字節 成可變稱為線, 該通知,我們也已經 在堆棧上分配 通過動態調整數組的方式。 我們正在刻意 為了避免調用malloc 因為再次,因為 控制C是 這一計劃的潛在功能,我們 不希望有這樣的代碼突然 由用戶擊打中斷 控制C,它的結果 是,我可能沒有機會 免費的東西我malloced。 所以我想用盡可能多 堆棧的是我可以在這裡。 接下來,一大堆到DOS。 該規範將闡述 究竟怎麼在這裡期待, 但評論給你 一個什麼樣的暗示擺在面前。 你首先需要 驗證請求行 並確保它看起來像 規範語法,可以這麼說, 說它應該。 然後你需要提取的東西 所謂的查詢中,出來的東西 問號之後,像 我們看到我們的谷歌的例子 在傳遞一個HD參數。 然後,我們一起串聯 Web服務器的根 與這就是路徑 這要求第一行 並形成的完整路徑 在文件中,我們要看看的。 此後,我們要確保 該文件存在並且可讀。 然後我們要提取其 文件擴展名,將.html或.PHP, 或一些這樣的擴展,它是在 請求字符串的最末尾。 接下來是一個整體 一串代碼,我們寫了 實際生成PHP 為您生成的內容。 概括地說,這 在名稱代碼採用 該文件你想PHP解釋。 我們通過一種叫做傳遞 管道進入PHP解釋器。 找回響應,雖然 所述響應是一個文件本身。 然後我們遍歷該文件的 字節,拉他們都到一個緩衝區 這樣我們就可以最終 打印出來。 事實上,所有的這些 調用這裡dprintf 可以讓我們打印的東西 稱為文件描述符,其 僅僅是一個整數 表示一個文件。 在精神上非常相似,但 從文件根本不同 明星指針。 請注意,您可以使用類似的語法 這裡的printf,這樣我可以動態 插入類似的長度 對於HTTP頭的值 所謂內容長度。 最終我用了 功能權限,以實際編寫 身體向請求。 不幸的是,我們只執行 動態支持 生成的PHP文件。 我們沒有實施的支持 靜態文件一樣的GIF,和JPEG, 和CSS和HTML文件。 ,不幸的是,留給你 以向客戶端作出響應的目的 此做。 因此,在那裡你會發現,有 不就是塊內的很多靈感, 但如果你稍微高了怎麼 我們走遍解釋PHP代碼, 該功能將使用 有一點不同。 事實上,你可以借 一些功能 也許是從取證 習題集,因為 在一天結束時,所有你需要 這裡做的是,一旦你知道什麼文件打開 一旦你知道這是所謂的 MIME類型或內容類型 需要讀取在這些字節 並以某種方式吐出他們回來了。 這和現在之旅 文件的其他功能。 截至第一連接, 它簡單地返回true 當它終於聽到 來自用戶的連接。 接下來是錯誤。 錯誤,同時,作為一個功能我們 寫來處理所有的不同的400 500 HTTP狀態 你可能想碼 以發送回用戶, 連同一個標準報文。 接下來是負載,特別 肉香功能,其目的在生活中 被從文件中讀取星的指針 文件的內容,成為一個全球性的緩衝 我們全局聲明 上述[?主力。 ?] 這是一個有點複雜,因為我們 必須從文件中讀取的字節 但檢查在每次迭代 我們是否已把 命中的文件的末尾或 別的東西出現了問題。 而我們使用realloc的,以確保 無論我們使用緩衝區增長 並不斷擴張,總是 字節數的保持領先 我們需要適合在那裡。 處理程序,同時, ,獲取功能 所謂由具有方式 註冊的控制C作為信號 我們要攔截。 請注意這裡的處理程序 它最終 電話停機,這當然 停止Web服務器。 不幸的是,查找 未實現。 在精神上,這是一個 很簡單的功能。 給定一個文件擴展名,它需要 回到它的所謂的MIME 型或內容類型。 我們在規範中指定 什麼映射必須是。 但你需要翻譯 它最終為C代碼。 接下來是我們同樣肉香功能 所謂的解析,在生活中,其目的 是閱讀,而不是從文件中, 但是從一個網絡連接。 具體來說,讀和解析 這是來自瀏覽器的HTTP請求 到服務器,這樣 最終我們可以解析 在剛剛在請求中的報頭 行,回到那些你 由全局緩衝器的方式 我們上面的[聲明?主力。 ?] 復位,同時,是 函數,我們定義 這被稱為內部迭代 主每一次你約 準備開始聽 為一個新的連接 讓我們總是知道 我們變量的狀態 所以,我們也已經 釋放任何內存 可能已被分配給 以前的網絡連接。 接下來是啟動時, 功能我們寫 包含整個 大量的網絡代碼 最終啟動Web服務器。 最後上來就是功能 所謂停止,這 正是這麼做的,它 停止Web服務器。 但首先,它可以釋放任何內存 仍然已經分配。 但它最終調用exit 甚至沒有返回控制 我們的主要功能。 最終,所述一個 最重要的技術 當執行該Web服務器 將是一個有點試驗和錯誤的, 有一個瀏覽器窗口打開 在右側和在一個終端窗口 離開時,服務器控制台 窗口,這樣就 可以看到,有消息 被顯示在屏幕上。 但更好的是將第三 窗口中,第二個終端窗口, 在您使用Telnet的使用 對於該規定的規範。 和Telnet僅僅是一個很 簡單的網絡程序 可以讓你假裝 是在一個窗口中的瀏覽器 而談話的另一個窗口。 這樣,您就可以看到 正是文本命令 這都回來了 從服務器到客戶端 無需戳 圍繞Chrome的開發者 在另外的工具 笨重的接口。