UNIX域套接字程式設計

2021-09-22 08:13:21 字數 2550 閱讀 2042

unix 域套接字(uds):unix domain socket。

unix域協議並不是乙個實際的協議族,而是在單個主機上執行客戶/伺服器通訊的一種方式,單個主機上執行通訊,也就是所謂的進行間通訊(ipc),所以unix域套接字協議可以視作ipc方法之一。

unix域提供兩中套接字api:位元組流套接字(類似tcp)和資料報套接字(類似dup)。但是面向資料報的uds也是可靠的,訊息既不會丟失也不會順序錯亂。

使用uds的過程和網路socket十分相似,也要先呼叫socket()建立乙個socket檔案描述符,address family指定為af_unix,type可以選擇sock_dgram或sock_stream,protocol引數仍然指定為0即可。

unix domain socket與網路socket程式設計最明顯的不同在於位址格式不同,用結構體sockaddr_un表示,網路程式設計的socket位址是ip位址加埠號,而unix domain socket的位址是乙個socket型別的檔案在檔案系統中的路徑(普通檔案系統中的路徑名),這個socket檔案由bind()呼叫建立,如果呼叫bind()時該檔案已存在,則bind()錯誤返回。

#define unix_path_max    108

#include struct sockaddr_un ;

sun_path表示與套接字關聯的位址,以null結尾,如果未指定位址通則通過以空字串作為路徑名指示,也就是說sun_path[0]值為0,這個效果就好像ipv4的inaddr_any和ipv6的addr_any_init

注意:unix域流式套接字connect發現監聽佇列滿時,會立刻返回乙個econnrefused,這和tcp不同,如果監聽佇列滿,會忽略到來的syn,這導致對方重傳syn。

uds程式設計

socketpair函式

這個是unix域套接字特有的函式,它建立兩個連線起來的套接字。

為了建立一對非命名的、相互連線的unix域套接字,使用者可以使用它們面向網路的域套接字介面,也

可使用socketpair函式

#include int socketpair(int family , int type , int protocol ,int sockfd[2]);

//返回:成功則為0,出錯則為-1

family: 為af_local或者af_unix。 

type:既可以是sock_stream也可以是sock_dgram。 

protocol:必須為0。 

sockfd[2]:新建立的兩個套接字別在sockfd[0]和sockfd[1]中返回; sockfd[2]可用於同程序通訊也可用於不同程序間通訊

#include #include #include #include #include #include #define on 0

void parent_process(int fd)

; while(1)

}void child_process(int fd)

; while(1)

}void one_process_exchange(int wfd,int rfd)

; strcpy(msg,"乙個程序通訊");

write(wfd,msg,strlen(msg));

memset(msg,0,sizeof(msg));

read(rfd,msg,100);

printf("%s",msg);

}int main()

#if on

one_process_exchange(srv[0],srv[1]);//測試同程序間通訊

#else

pid_t chldpid = fork(); //測試不同程序間通訊

if ( chldpid == 0)

else if ( chldpid > 0 )

else

#endif

}

同程序間通訊結果:

root@liuxinju-virtualbox:/home/liuxinju/work/linuxapi# ./a.out 

乙個程序通訊

不同程序間通訊:

root@liuxinju-virtualbox:/home/liuxinju/work/linuxapi# ./a.out 

parent,hello,i am child

child,hello,i am parent

parent,hello,i am child

child,hello,i am parent

parent,hello,i am child

child,hello,i am parent

^c

unix域套接字 IPC

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

linux網路程式設計(unix域流式套接字)

unix域套接字 流式 1.標頭檔案 include 2.資料結構 struct sockaddr un 3.服務端流程 1.建立套接字 sockfd socket af unix,sock stream,0 2.繫結位址到socket struct sockaddr un server addr ...

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

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