天天看點

Socket程式設計實踐(13) --UNIX域名協定

   UNIX域套接字與TCP相比, 在同一台主機上, UNIX域套接字更有效率, 差點兒是TCP的兩倍(因為UNIX域套接字不須要經過網絡協定棧,不須要打包/拆包,計算校驗和,維護序号和應答等,僅僅是将應用層資料從一個程序複制到還有一個程序, 并且UNIX域協定機制本質上就是可靠的通訊, 而網絡協定是為不可靠的通訊設計的).

   UNIX域套接字能夠在同一台主機上各程序之間傳遞檔案描寫叙述符;

   UNIX域套接字與傳統套接字的差别是用路徑名來表示協定族的描寫叙述;

   UNIX域套接字也提供面向流和面向資料包兩種API接口,相似于TCP和UDP,可是面向消息的UNIX套接字也是可靠的,消息既不會丢失也不會順序錯亂。

   使用UNIX域套接字的過程和網絡socket十分相似, 也要先調用socket建立一個socket檔案描寫叙述符, family指定為AF_UNIX, type能夠選擇SOCK_DGRAM/SOCK_STREAM;

UNIX域套接字位址結構:

基于UNIX域套接字的echo-server/client程式

   1.bind成功将會建立一個檔案。權限為0777 & ~umask

   2.sun_path最好用一個/tmp檔案夾下的檔案的絕對路徑, 并且server端在指定該檔案之前首先要unlink一下;

   3.UNIX域協定支援流式套接口(須要處理粘包問題)與報式套接口(基于資料報)

   4.UNIX域流式套接字connect發現監聽隊列滿時,會立馬傳回一個ECONNREFUSED。這和TCP不同,假設監聽隊列滿,會忽略到來的SYN,這導緻對方重傳SYN。

socketpair

建立一個全雙工的流管道

參數:

   domain: 協定家族, 能夠使用AF_UNIX(AF_LOCAL)UNIX域協定, 并且在Linux上, 該函數也就僅僅支援這一種協定;

   type: 套接字類型, 能夠使用SOCK_STREAM

   protocol: 協定類型, 一般填充為0;

   sv: 傳回的套接字對;

socketpair 函數跟pipe 函數是相似: 僅僅能在具有親緣關系的程序間通信。但pipe 建立的匿名管道是半雙工的,而socketpair 能夠覺得是建立一個全雙工的管道。

能夠使用socketpair 建立傳回的套接字對進行父子程序通信, 例如以下例:

sendmsg/recvmsg

它們與sendto/send 和 recvfrom/recv 函數相似,僅僅隻是能夠傳輸更複雜的資料結構,不僅能夠傳輸一般資料。還能夠傳輸額外的資料。如檔案描寫叙述符。

msghdr結構體成員解釋:

   1)msg_name :即對等方的位址指針。不關心時設為NULL就可以;

   2)msg_namelen:位址長度。不關心時設定為0就可以;

   3)msg_iov:是結構體iovec 的指針, 指向須要發送的普通資料, 見下圖。   

      成員iov_base 能夠覺得是傳輸正常資料時的buf;

      成員iov_len 是buf 的大小;

   4)msg_iovlen:當有n個iovec 結構體時,此值為n。

   5)msg_control:是一個指向cmsghdr 結構體的指針(見下圖), 當須要發送輔助資料(如控制資訊/檔案描寫叙述符)時, 須要設定該字段, 當發送正常資料時, 就不須要關心該字段, 并且msg_controllen能夠置為0;

   6)msg_controllen:cmsghdr 結構體可能不止一個(見下圖):

   7)flags: 不用關心;

Socket程式設計實踐(13) --UNIX域名協定

為了對齊,可能存在一些填充位元組(見下圖)。跟系統的實作有關,但我們不必關心,能夠通過一些函數宏來擷取相關的值。例如以下:

Socket程式設計實踐(13) --UNIX域名協定

程序間傳遞檔案描寫叙述符

分析:

   我們知道。父程序在fork 之前打開的檔案描寫叙述符。子程序是能夠共享的,可是子程序打開的檔案描寫叙述符,父程序是不能共享的,上述程式就是舉例在子程序中打開了一個檔案描寫叙述符,然後通過send_fd 函數将檔案描寫叙述符傳遞給父程序。父程序能夠通過recv_fd 函數接收到這個檔案描寫叙述符。先建立一個檔案read.txt 後輸入幾個字元,然後執行程式;

注意:

   (1)僅僅有UNIX域協定才幹在本機程序間傳遞檔案描寫叙述符;

   (2)描寫人物的價值的叙述性說明程序間傳輸檔案傳輸檔案不是叙述性休息(其實send_fd/recv_fd這兩個值不同), 但創造在接收過程中一個新的檔案中的符号的說明中被描述, 該檔案和該檔案識别符和發送處理的叙述性描述中的符号的說明中被描述被傳遞到核心在同一檔案表項.

本文轉自mfrbuaa部落格園部落格,原文連結:http://www.cnblogs.com/mfrbuaa/p/5044136.html,如需轉載請自行聯系原作者

繼續閱讀