使用UNIX域函式進行套接字程式設計

2021-08-01 05:44:22 字數 2008 閱讀 1534

《linux網路程式設計》第11章高階套接字,本章介紹高階套接字的程式設計,包含unix域的函式、廣播、多播、資料鏈路層的程式設計等在linux網路程式設計中比較常用的方法。本節為大家介紹使用unix域函式進行套接字程式設計。

ad:

11.1.3  使用unix域函式進行套接字程式設計

使用unix域函式進行套接字程式設計與af_inet的方式一致,不同的地方在於位址結構不同。下面是乙個位址unix域套接字程式設計的簡單例子。

01      #include <

sys/types.h>

02      #include <

sys/socket.h>

03      #include <

linux/un.h>

04      #include <

string.h

>

05      #include <

signal.h

>

06      #include <

stdio.h

>

07      #include <

errno.h

>

08      #include <

unistd.h

>

09        

10      /*  

11      *錯誤處理函式  

13      */  

14      static void display_err(const char*on_what)  

15        

19        

20      int main(int argc,char*argv)  

21       

上面的這個例子的步驟如下:

第23行定義了整型的變數sock_unix,用來存放建立的套接字檔案描述符。

第24行定義了sockaddr_un型別的位址結構並且命名為addr_unix。後面的程式中將會使用型別af_local套介面位址來處理這個結構。

第26行定義了路徑名,這個路徑名用於繫結socket的時候使用。

第31行建立乙個unix型別的socket,在33行進行錯誤型別檢測。

第40行呼叫unlink()函式。因為af_unix位址會建立乙個檔案系統物件,如果不再需要必須刪除。如果這個程式最後一次執行時沒有刪除,這條語句會試著進行刪除。

第45行將adrr_unix的位址結構清零。

第47行將位址族初始化為af_unix。

第48行向位址結構中複製路徑名"/demon/path"。

第49行計算位址的長度。

第54行呼叫bind()函式,將格式化的位址賦值給第23行建立的套介面。

第63行關閉套介面。

第64行呼叫bind()函式時刪除為套介面所建立的unix路徑名。

上面的例子中,需要首先建立乙個路徑名為"/demon/path"的目錄,如果需要建立乙個臨時使用的套接字,而又不方便手動建立,可以使用linux中的乙個特殊方法,即格式化抽象本地位址。

格式化抽象本地位址的方式需要將路徑名的第乙個字元設定為空字元,即"\0"。例如,對於上面的例子,可以在第50行插入如下的**:

50      addr_unix.sun_path[0] = 0; 

這時在第49行時,結構addr_unix的成員sun_path的內容如表11.1所示。

表11.1  49行時sun_path的內容

第50行對sun_path的內容進行了修改,進行bind的時候,其路徑名已經發生了變化,其實是對字串"demon/path"進行了繫結,在第54行時sun_path的內容如表11.2所示。

表11.2  54行時sun_path的內容

計算unix域結構的長度使用sizeof()函式,其實可以使用sun_len巨集來結算,例如第49行可以修改為如下的方式:

49          len_unix = sun_len(addr_un); 

unix域套接字 IPC

沒用過域套接字,一般都用管道來進行程序通訊,不過聽說域套接字比管道好。就試試吧。域套接字在socket函式建立的時候,第二個字段,可以是sock stream,也可以是sock dgram。可是在用sock dgram建立接收端的時候,我發現,它可以不用listen和accept過程,直接接收就可以...

UNIX域套接字程式設計

unix 域套接字 uds unix domain socket。unix域協議並不是乙個實際的協議族,而是在單個主機上執行客戶 伺服器通訊的一種方式,單個主機上執行通訊,也就是所謂的進行間通訊 ipc 所以unix域套接字協議可以視作ipc方法之一。unix域提供兩中套接字api 位元組流套接字 ...

利用Unix域套接字實現IPC

寫完後,至少除錯了30分鐘時間。錯誤1 snprintf argsockfd,sizeof argsockfd d sockfd 1 snprintf argmode,sizeof argmode d mode 寫作 snprintf argsockfd,sizeof argsockfd s soc...