1:socket編程中採用的協議族主要有兩種
:
1>:網路通訊協定族(形式如:AF_INET, PF_INET等)
2>:本地unix域格式的協議族(形式如:AF_LOCAL, AF_UNIX等)
註:協議族的選擇體現在 int socket(int domain, inst type, int protocol)函數的第一個參數處。
2:這兩種協議族的區別:
1>:本地unix域格式的協議族,只能用於本機(即,用戶端和伺服器端在同一台機器);而網路通訊協定族
不僅可以用於本機也可以跨網路
2>:本機上的用戶端和服務端之間的通訊採用本地unix域格式的協議族要比採用網路通訊協定族的速度快
3>:本地unix域格式的協議族用的也比較廣泛,如一些伺服器的模組間的通訊(mysql), 再比如管道等。
3:socket通訊的幾個關鍵的函數
1>:send函數,原型, int send(SOCKET s, const char FAR *buf , int len, inf flags)。該函數的詳細介紹:
參數s,通訊端描述符; 參數buf,存放發送資料的緩衝區; 參數len, 發送資料的長度; 參數flags,標誌,一般為0;
該函數的執行流程(同步socket
):
(1):首先比較len與通訊端s的發送緩衝區長度的大小(len1),如果len大於len1,那麼該函數立即返回SOCKET_ERROR
(2):如果len < len1, 然後send檢查協議是否是在發送s的發送緩衝區裡的資料,如果是就等待協議將資料發送完,如果協議還沒有開始發送s的發送緩衝區裡的資料或者s的發送緩衝區是空的,那麼send就比較s的發送緩衝區的剩餘空間(len2)和len的大小
(3):如果len > len2, 那麼send就一值等待協議將s的發送緩衝區中的資料發送完
(4):如果len < len2, 那麼就將待發送的資料copy到s的發送緩衝區裡
註:send函數只是將待發送的資料copy到通訊端s的發送緩衝區裡面,而負責將資料傳送到通訊的另一端的是協議
。
(5):send函數的返回情況:如果len > len1 直接返回SOCKET_ERROR; send將資料傳送到通訊端s的發送緩衝區裡,而協議在傳送資料時,出現網路故障,也返回SOCKET_ERROR
2>:recv函數(同步socket)
,原型, int recv(SOCKET s, char FAR *buf, int len, int fags)
(1):參數說明, buf,表示接受資料的緩衝區,其餘的相同
(2):該函數的執行過程,recv先等待通訊端s的發送緩衝區的資料被協議傳送完畢,如果協議在傳送s的發送緩衝區裡資料時,出現網路
網路故障,那麼recv函數將返回SOCKET_ERROR。如果s的發送緩衝區中沒有資料或者被協議成功傳送,然後,recv檢查s的接收緩衝區,如果接收緩衝區中沒有資料或者協議正在接收資料,那麼recv函數將一直等待,直到協議將資料接收完畢。如果協議接收資料完畢,那麼recv函數就會將s的接受緩衝區中的資料copy到buf中
註:協議接收到的資料可能大於buf的長度,所以在這種情況下要調用幾次recv函數才能把s的接受緩衝區中的資料copy完。真正接受資料的是協議。
註:send與協議是有關聯的,如果協議在傳送資料時出現網路故障,那麼send函數將返回SOCKET_ERROR,而recv與協議是沒有關聯的(個人理解層面)
3>:設定s的發送和接受緩衝區大小的函數 setsocketopt函數,詳細資料,待用時online
4>:關閉通訊端描述符s的函數有兩個close()和shutdown(),區別如下:
len1 int s; // existing socket
len2 int d;
len3 d = dup(s);
len4 close(s); //nothing happens yet
len5 close(d); //last close, so shudown socket
註:close關閉s之後,不會起任何作用(因為還有一個通訊端描述符指向該通訊端),只有close關閉d之後,才會起作用。
但是:shutdown()函數會立即關閉掉該通訊端。
5>: