linux socket程式設計相關知識的總結

2021-05-22 07:22:20 字數 2045 閱讀 9120

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);

len5    close(d);  //last close, so shudown socket

注:close關閉s之後,不會起任何作用(因為還有乙個套接字描述符指向該套接字),只有close關閉d之後,才會起作用。

但是:shutdown()函式會立即關閉掉該套接字。

5>:

linux socket程式設計相關問題

1.connect函式響應中斷返回後仍然回到函式的呼叫。實踐證明,對於乙個非阻塞的socket,如果在呼叫connect函式時,如果發生中斷,這函式響應中斷,但當中斷返回時,繼續connect函式的呼叫,直到connect超時失敗或接收到錯誤icmp包或連線成功 2.accept 如果偵聽程序是非阻...

linux socket 程式設計

兩段程式 可用於開發板和主機之間的資料傳輸,很管用!file client.c檔案傳輸客戶端程式示例 本檔案是客戶機的 include for sockaddr in include for socket include for socket include for printf include f...

linux socket程式設計

雙休日無聊透頂,看了四五集 反恐24小時 實在不想看了,於是就想搞linux的socket programming來玩玩,前期資料都準備好 早就想寫個看看了。首先,寫個簡單的client端的程式 呵,其實是copy!server端用的是網上當的乙個除錯工具 一開始用的是以前用過的乙個多執行緒執行的介...