1. 程式人生 > >UNIX域套接字中的抽象名字空間

UNIX域套接字中的抽象名字空間

原文地址:http://blog.chinaunix.net/uid-317451-id-92602.html

UNIX域(PF_UNIX、PF_LOCAL或AF_UNIX、AF_LOCAL)套接字為UNIX系統的本地程序間的雙向資料通訊提供了高效的解決方案。


我們可以認為它是管道的雙向通訊版本。其中命名(繫結明確的地址)的套接字對應於命名管道(mknod xx p),匿名套接字(socketpair)對應於匿名管道(pipe)。有所不同的是UNIX域套接字除了提供面向流(SOCK_STREAM)的介面,還提供有明確資料邊界的面向資料報的(SOCK_DGRAM)介面,Linux在2.6.4之後還提供面向流的有明確資料邊界的介面(SOCK_SEQPACKET)。UNIX域的資料報介面不同於以網路域(AF_INET或PF_INET)的資料報介面,因為在本機的緣故,它一般情況下並不發生丟包或者是亂序,可以認為它提供可靠的資料通訊服務。


鑑於APUE等經典書目都對UNIX域套接字有較為詳盡的論述,本文也將不再贅述。這裡主要介紹Linux所支援的UNIX域套接字的抽象名字空間(abstract namespace)。Linux下UNIX域套接字的地址結構定義如下:

         #define UNIX_PATH_MAX 108

         struct sockaddr_un {
             sa_family_t sun_family; /* AF_UNIX */
             char sun_path[UNIX_PATH_MAX]; /* pathname */
         };


對於一般的地址來說,sun_path須是一個合法的檔案路徑,包含絕對路徑和相對路徑,只是其總長度不能大於108。man 7 unix的結論是此時sun_path必須以'\0'結尾,Linux系統上的實踐表明,這並不是必須的,在Linux系統上,這個路徑的最大長度是108而不是107,不知到其它系統如何,使用者還是儘量遵守規則的好,不然移植可能會出問題。抽象名字空間是相對於檔案系統的名字空間而言的,此地址在檔案系統上並沒有實際檔案與之相對應,這就能避免汙染檔案系統的名字空間,因為它在相應的檔案描述符關閉的時候就會自動消失,沒有手動移除套接字檔案的麻煩。抽象名字以字元'\0'開始,其後可以跟隨任何資料,包括'\0',名字的長度在呼叫bind、connect和sendto的時候作為地址的長度傳入。netstat中path以'@'開始的套接字就屬於抽象名字空間。


[email protected] test $ netstat --unix
Active UNIX domain sockets (w/o servers)
Proto RefCnt Flags       Type       State         I-Node Path
unix  2      [ ]         DGRAM                    1078   @/org/kernel/udev/udevd
unix  2      [ ]         DGRAM                    9517   @/org/freedesktop/hal/udev_event

對於UNIX域的資料報套接字還有點兒特殊,它不會在connect的時候自動繫結本端到一個抽象名字空間,本地地址必須手工用bind指定,否則它就會匿名傳送資料,接收端收到的地址為空,無法向其回送資料,這樣的設計在不關心資訊來源的情況下應該會提高通訊效率。

相關推薦

UNIX抽象名字空間

原文地址:http://blog.chinaunix.net/uid-317451-id-92602.html UNIX域(PF_UNIX、PF_LOCAL或AF_UNIX、AF_LOCAL)套接字為UNIX系統的本地程序間的雙向資料通訊提供了高效的解決方案。 我們可以認為

go語言unix發送udp報文

dial ring pack sock world lis add client 語言 /* server.go */package mainimport ( "fmt" "net" &quo

【Nebula系列】通過UNIX傳遞描述符的應用

_file__ 直接 sca linux網絡 tran 和數 權限 cif .cpp ??傳送文件描述符是高並發網絡服務編程的一種常見實現方式。Nebula 高性能通用網絡框架即采用了UNIX域套接字傳遞文件描述符設計和實現。本文詳細說明一下傳送文件描述符的應用。 1. T

通過UNIX傳遞文件描述符

and starting github option nts wiki 靜態方法 socket union 傳送文件描述符是高並發網絡服務編程的一種常見實現方式。Nebula 高性能通用網絡框架即采用了UNIX域套接字傳遞文件描述符設計和實現。本文詳細說明一下傳送文件描述符

嵌入式linux網路程式設計,UNIX,AF_LOCAL,PF_LOCAL,PF_UNIX,,AF_UNIX,程序間通訊機制

文章目錄 1,UNIX域套接字 2,UNIX域套接字模型 3,UNIX域套接字 --- 示例 3.1,net.h 3.2,client.c 3.3,sever.c 3.4,linklist.h 3.5,link

20-unix地址結構

1. unix域協議 看到這個標題,不知道的小夥伴肯定以為這是一個協議族之類的,但實際上unix域協議是在單臺主機上客戶端與服務端之間的通訊方法,簡單來說,unix域協議也是一種程序間通訊方式,用於同一臺主機上的客戶端和服務端,為不同的程序間傳遞描述符。 通常在同一臺主機上,使用unix

程序筆記2:程序之間的通訊(UNIXsocket)

socket的地址資料結構根據不同的系統以及網路環境有不同形式。為了使不同格式地址能夠被傳入套接字函式,必須強制將地址結構轉換為: struct sockaddr{ sa_family_t sa_family; /* address family*/ char

linux網路程式設計之socket(十六):通過UNIX傳遞描述符和 sendmsg/recvmsg 函式

void send_fd(int sock_fd, int send_fd) {     int ret;     struct msghdr msg;     struct cmsghdr *p_cmsg;     struct iovec vec;     char cmsgbuf[CMSG_SPACE(

使用Unix進行跨程序通訊

Unix域套接字簡介 《Unix環境高階程式設計》中對Unix域套接字有如下介紹: 雖然socketpair函式建立相互連線的一對套接字,但是每一個套接字都沒有名字。這意味著無關程序不能使用它們。 我們可以命名unix域套接字,並可將其用於告示服務。但是要

淺析SO_REUSEPORT和SO_REUSEADDR的區別

Socket的基本背景 在討論這兩個選項的區別時,我們需要知道的是BSD實現是所有socket實現的起源。基本上其他所有的系統某種程度上都參考了BSD socket實現(或者至少是其介面),然後開始了它們自己的獨立發展進化。顯然,BSD本身也是隨著時間在不斷髮

通訊共享記憶體通訊效能比較

最近碰到一個問題,兩個程序間需要實時交換一些資料,資料量不是很大,就72個位元組。當時估計簡單起見,用的是域套接字的方式。 後續效能測試的時候,忽然發現當網路包併發量很大時,效能忽然大幅下降,用strace跟蹤發現,忽然有好多的read,write操作,檢視程式碼跟蹤到此處

C++做HTTP服務應用 在Socket對HTTP頭的處理

這些天都在弄個手機控制電腦的應用.. 在WEB上實現那必然就要處理GET與POST提交 起初在電腦上所有瀏覽器都沒有什麼問題 到了iPhone 上就出現在POST引數無法接收 以為是JS褲中的AJAX在Safari有問題..但是發現多次提交有時也可以接收引數 想到可能Saf

Java的理解

java中套接字的理解 什麽是socket,以及兩端ServerSocket和Socket是真正的幹什麽用的,也終於理解到其實普通的socket也就僅僅是普通管道,兩邊通過這個管道互相傳和接受信息。建立Socket連接建立Socket連接至少需要一對套接字,其中一個運行於客戶端,稱為ClientSocket,

網路程式設計time_wait的作用和選項SO_REUSEADDR

這兩天看APUE為一個簡單的問題特別惱火,該問題起源於兩個套接字選項就是SO_REUSEADDR和SO_REUSEPORT其實在看的過程中問學長了,學長解釋的也比較清楚,就是自己悟性不好,一時半會沒理解。自己在網上找了幾篇優秀的部落格看了,受益頗多! 先從套接字選項SO_REUSEADD

Qt使用 windows 程式設計 客戶端demo

在Qt裡面使用connect需要加上兩個::不然會與訊號連線衝突 WSADATA wsa; if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0) {     cout << "WSAStartup faile

UNIX網路程式設計卷1:聯網API 詳解筆記

UNIX網路程式設計卷1:套接字聯網API 詳解筆記 第一部分:簡介和TCP/IP 1.Socket 套接字 sockfd = socket(AF_INET(網際流), SOCK_STREAM, 0); 2.*bind(int fd, const struct sockaddr sa,

UNIX網路程式設計——基本TCP程式設計 【轉貼】

一、基於TCP協議的網路程式 下圖是基於TCP協議的客戶端/伺服器程式的一般流程:                             &

accept的監聽和已連線

int accept(int sockfd, struct sockaddr* cliaddr, socklen_t *addrlen); 該函式用於從已完成連線的佇列隊頭返回下一個已完成連線。 其中sockfd為監聽套接字 cliaddr和addrlen由核心填入

在io複用把監聽設為非阻塞

  往往在select 或 epoll 中把 listen_socket 設定為非阻塞 O_NONBLOCK 原因是出在 accept 上, 比如有這麼一個客戶端 : RST客戶端 當這個select或epoll 的伺服器非常繁忙時, 有這麼一個一連線就斷開的客戶端,

Unix網路程式設計》卷1:聯網API(第3版):簡介、傳輸層、程式設計

全書共31章+附錄。 計劃安排:吃透這本書,一天三章+原始碼,並實測程式碼做當天筆記,CSDN見。時間安排:計劃時間1.5個月 == 6個週末 == 12天。 2017.08.05    第01-03章:TCP/IP簡介、傳輸層、套接字程式設計簡介2017.08.06