1.socket 函式
首先被呼叫的函式,用於選擇通訊協議。
socket呼叫成功後,得到的套接字為主動套接字closed狀態。
pf 和 af 的關係
2.connect
connect 發起主動握手,
connect 呼叫時,tcp 傳送 syn
tcp接收到 ack時,connect 返回。
connect 前,可以不bind,核心會在connect 時隨機分配原套接字。
connect 開始時,tcp從 closed --> syn_send,成功時, syn_send --> establish
每次 connect 失敗後,都必須 close 套接字,並重新呼叫 socket。
3.bind
設定源套接字位址,套接字狀態不改變
可以指定也可以不指定,不指定核心會分配,
設定為0則為不指定,
指定任意ip時,下面兩種都一樣,因為 inaddr_any == 0,大小端都一樣
serv.sin_addr.s_addr =inaddr_any;serv.sin_addr.s_addr = htonl(inaddr_any);
bind 返回的常見錯誤是, eaddrinuse (位址已使用)。
4.listen
兩個作用:
(1)套接字狀態從主動狀態--> 被動狀態 closed --> listen
l (2)isten 初始化排隊的最大連線個數。
核心為套接字分配了兩個佇列:
未完成連線佇列,即正在進行三次握手的,這些套接字處於 syn_recv 狀態。
已完成連線佇列,即已經完成三次握手的,這些套接字處於 established 狀態。
backlog >= 兩佇列總和
5.accept
用於已連線佇列頭返回已連線。
如果已連線隊列為空,則程序隨眠。
accept 若成功,則返回核心重新分配的套接字。
6.典型的多程序併發伺服器
for(;;)
close(connfd);
}
父子程序都要 close 未用的套接字,以減少引用計數。
當 套接字關閉時,才會發出 fin。
另外也避免了 檔案描述符用盡。
7.close
減少套接字引用計數,當引用計數為0,則關閉套接字(tcp會傳送fin,對端tcp接受到fin後,向應用層傳送eof)。
close後應用程式無法通過套接字繼續讀寫操作。
但tcp會將剩餘的資料進行收發。
8.getsockname 和 getpeername
通過 檔案描述符,獲得 套接字對資訊。
用於子程序 exec 後,需要獲得 父程序時的套接字對資訊,因為套接字資訊在核心區,不會被exec後覆蓋,所以子程序只要獲得 檔案描述符即可(可通過命令列引數獲得)
第四章 程式設計
選擇語言的原則 最少的工作量原則 最少技巧性原則 最少錯誤原則 最少維護原則 減少記憶原則 總原則 先求正確後求快 先求清晰後求快 求快不忘保持程式正確性 保持程式整潔以求快 不要因效率而犧牲清晰 好程式標準 易於測試和除錯 易於維護 易於修改 設計簡單 高效率結構化程式設計主要包括兩方面 在編寫程...
程式設計珠璣第四章
正文裡面涉及到程式設計方法學的內容。不再細述 1 加及條件是0 l u n 1 2 這個函式可以寫成如下形式 int bs int a,int begin,int end,int v if e a end e v return e a return 1 再給一段測試 include include ...
MFC Windows 程式設計 第四章 選單
編譯一次後就不用再編譯了,而已加快程式編譯速度,一般將不更改的標頭檔案 c執行時標頭檔案和其他靜態型別標頭檔案包含在裡面。2 基於檢視的應用程式體系結構wm paint和使用者區滑鼠訊息 鍵盤訊息處理程式都必須在檢視中進行處理,所有在框架視窗使用onsetfocus 焦點傳遞給檢視 和過載oncmd...