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域套接字的地址結構定義如下:
|
對於一般的地址來說,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:程序之間的通訊(UNIX域套接字socket)
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