--- tags: cs:app, csapp --- # [CS:APP](https://hackmd.io/@sysprog/CSAPP) 第 11 章重點提示 ## 網路程式設計 - [ ] [Part I 簡報](https://www.cs.cmu.edu/~213/lectures/20-netprog1.pdf) / [錄影](https://scs.hosted.panopto.com/Panopto/Pages/Viewer.aspx?id=54178cf8-d57e-4984-b46c-b66db645431a) - [ ] [Part II 簡報](https://www.cs.cmu.edu/~213/lectures/21-netprog2.pdf) / [錄影](https://scs.hosted.panopto.com/Panopto/Pages/Viewer.aspx?id=0015deb4-3584-4b10-98c9-38f27784feb4) - [ ] [課程使用的程式碼](https://www.cs.cmu.edu/~213/code/22-netprog1/) ## 網頁伺服器 網頁伺服器運作流程如下:  典型 Client–Server 步驟: 1. client 送出連線請求 2. server 根據自身資源處理請求 3. server 回傳結果 4. client 取得回應並顯示 下圖說明程式面細節,左側為 client,右側為 server:  1. 雙方先呼叫 `getaddrinfo()` 解析位址並取得 `struct addrinfo`,其中包含 IP、通訊埠與服務名稱等資訊 2. 接著透過 `socket()` 建立通訊端,回傳一個檔案描述子;此步驟僅建立端點,不會觸發網路傳輸 3. server 呼叫 `bind()` 將 socket 與指定 IP 與通訊埠連結 (位於核心空間) 4. server 進入監聽狀態並呼叫 `listen()`,等待 client 連線 5. server 使用 `accept()` 接受連線並為該 client 建立新的 socket 6. client 端則在 `connect()` 發出連線要求並等待 server `accept` 7. 連線建立後,雙方透過 `read`/`write` (或封裝如 rio,reliable I/O)進行資料交換 8. 當 client 結束會送出 EOF,server 接收後關閉對該 client 的 socket 9. server 關閉後可選擇再接受下一個 client,或關閉整體服務 上述流程僅適合單一 client 與單一 server,若需支援多個 client,可採用《CS:APP》第 12 章介紹的並行模型。 server 持續監聽,當偵測到 client 請求便 `fork` (或在核心空間建立 worker) 處理個別連線。每個子行程或 worker 擁有獨立位址空間,因此彼此互不干擾,能滿足多 client 需求。從 server 角度來看,就是不斷接受連線並將處理工作分派給新的行程或執行緒。 ## 相關報告 * [server-framework](https://hackmd.io/s/HJY7Bzspf) * [nstack](https://hackmd.io/s/ryfvFmZ0f) * [nstack 開發紀錄 (1)](https://hackmd.io/s/ryfvFmZ0f) * [nstack 開發紀錄 (2)](https://hackmd.io/s/r1PUn3KGV)
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up