前言:
這算是第二次系統地閱讀UNPv1,正如副标題,不希望寫成書摘、縮寫版,盡量多寫寫個人體會和獲得的經驗,是以很多地方都會從全書的角度來說明,而不僅僅限于某個章節内部。
SCTP、信号驅動I/O、廣播和多點傳播等内容不包括在内。
準備工作:
(1)vim插件搭建
從别人那裡拷貝現成的的.vimrc和插件,分别放于/home/使用者名 和/home/使用者名/vim檔案夾下就行了。
(2)Xshell遠端登入
熱身:出錯處理和包裹函數
UNP中的代碼風格有一點是使用包裹函數和作者編寫出錯處理庫相結合,這使得初學者可以把注意力集中在學習主幹代碼本身,而不是在初學階段就不得不對所用到的函數考慮出錯處理,同時這并不影響代碼的穩健型,仍然提供了出錯時的提示和處理功能。是以複習的第一步是從出錯處理開始,這是UNP附錄D.3的内容,幾個錯誤處理函數按照錯誤的差異決定以abort()、exit(1)、還是return做結尾;而出錯資訊的處理有一個使用了可變參數清單的函數來完成,它按照需要把出錯資訊傳遞給syslog或是标準錯誤輸出。
包裹函數根據其調用函數的出錯情況來調用出錯處理,并且把全局變量errno預存,處理完再傳回,防止其他程序覆寫。
第一章 & 第二章 基礎知識
對于netstat -i -a -n的各列含義,如果不明白可以使用ifconfig <指定接口>來檢視。
本來想了解一下套接字相關函數實作,但是發現它們的代碼比較複雜也比較長,沒有深入下去,如果讀者有興趣可以自行參考《Linux核心情景分析》。了解了一部分内容:套接字描述符其實是特殊的已打開檔案,這形成了一種特殊的檔案系統sockfd。與檔案系統的關聯:i_mode中S_IFSOCK标志位設為1,并将i_sock也設為1。(對檔案系統知識的缺乏也是沒有深入看下去的原因。)
關于這些函數關系的比喻:“sokcet()是安裝電話機,bind()為它指定一個使用的号碼,connect()是向某個号碼的伺服器撥号。”
TCP狀态轉換圖很經典,結合這個圖可以對各個函數(bind、listen、connect、accept、close)作出的狀态轉換(阻塞時的狀态、傳回時機等)有更好的了解。狀态可以用netstat -anp|grep <#port>來檢視,在後續的程式運作和調試中使用這個指令能加深對狀态和其轉換的了解。
習題2.5回顧了MSS和路徑MTU發現功能的關系,值得看一看。
第三章 & 第四章 常用函數與資料結構
通用套接字的意義:使用sockaddr的強制轉換可以使套接字函數能夠處理來自所有支援的任何協定族的套接字結構,這也是為什麼它們需要一個這個結構的長度作為參數的原因。
UNP提供readline的原因是read和write不能夠按行處理緩沖區。
socket()的參數表比較有意思,後兩個參數會互相限定,但是由于這個限制不是唯一的,不可能把三個參數簡化成兩個參數。這麼講比較抽象,請結合圖4-5來了解。
connect()的出錯:逾時、不可達、拒絕(可達但是不提供請求的服務)。
bind()通常是伺服器需要進行而客戶不必進行的。事實上客戶限定的套接字是由核心決定,綁定非通配位址後,解複用由核心而不是程序完成。
listen()的backlog參數UNP解釋的比較含混,準确的解釋可以在man裡看到,并與具體系統有關。
每個檔案或套接字都有一個引用計數(對于python,任何對象都有),這也相對于後面對close()和shutdown()差異的解釋(前者引用計數-1,為0時關閉;後者直接關閉并發送TCP連接配接終止消息)。
第五章 基本TCP程式設計 & 第八章 基本UDP套接字程式設計
第六章 I/O複用(select、poll、kqueue、epoll)& 第十六章 與非阻塞I/O
而對于UNP的第十六章的非阻塞I/O,基本都是通過設定套接字為非阻塞模式并select來實作的。但是非阻塞I/O并沒有投入睡眠,而是反複地進行系統調用(6.2 I/O模型)。
同時,6.4~6.6節非常繞口的解釋了為什麼stdio和select混合使用時非常容易犯錯誤的:對EOF的處理會導緻函數的退出,而這時發送緩沖區可能還有内容要處理。
第七章 套接字選項 & 第十一章 名字位址轉換 & 第十四章 進階I/O函數
内容很多,但是沒必要一條一條記着,有需要再查就行。
第十一章提供的一些函數比較好用(tcp_listen等),可以作為自己以後用的庫函數。
第十三章 守護程序
編寫的daemon_init()可以守護程序化目前程序,值得加入函數庫。
第三十章 C/S設計範式
這章比較綜合,将不同的C/S實作方式做了個綜合和比較,包含了疊代模型、程序模型、線程模型、簡單的程序/線程池(預先派生,任務配置設定和均衡由核心完成)、程序互斥方式(檔案鎖和線程鎖)、描述符傳遞(使用到了UNIX域套接字)等,并且還包含了程序使用的使用者/系統時間的測定,非常有價值,建議讀者把這部分代碼動手實作一下。
另外第十二章的IPv4/v6互操作性簡單讀了下。
本文轉自五嶽部落格園部落格,原文連結:www.cnblogs.com/wuyuegb2312/archive/2013/03/31/2910059.html,如需轉載請自行聯系原作者