使用套接字出了可以實現不同網路間主機的通訊外,還可以實現同一主機的不同程序間的通訊,且建立的通訊時雙向的通訊。這裡所指的使用套接字實現程序間通訊,是由將通訊域指定為pf_unix來實現的。下面是socket函式的具體訊息定義,該函式的形式如下:
int socket(int domain, int type, int protocol);
socket函式中的domain用於指定通訊域,domain引數取pf_unix時,表示建立unix域的套接字。使用pf_unix域的套接字可以實現同一機器上的不同程序間的通訊。
int bind(int sockfd, const struct sockaddr *my_addr, socklen_t addrlen);
其引數my_addr為指向結構體sockaddr_un的指標,該結構體的定義如下:
struct sockaddr_un{
sa_family_t sun_family; /* pf_unix或af_unix*/
char sun_path[108]; /*路徑名*/
在該結構體中,sun_family 為af_unix,sun_path是套接字在檔案系統中的路徑名。
1.1伺服器端實現
程式serv.c為使用套接字在unix域內實現程序間通訊的伺服器端程式。首先,程式通過呼叫socket函式,建立了監聽連線的套接字,然後呼叫bind函式,將套接字與位址資訊關聯起來。呼叫listen函式實現對該埠的監聽,當有連線請求時,通過呼叫accept函式建立與客戶端的連線,最後,通過呼叫read函式來讀取客戶機傳送過來的訊息,當然也可以使用recv函式實現相同的功能。serv.c具體**如下:
//unix域通訊**例項,伺服器端
#include
#include
#incude
#inlcude
//定義用於通訊的檔名
#define unix_domain "/tmp/unix.domain"
int main()
int listen_fd;
int com_fd;
int ret;
int i;
static char recv_buf[1024];
int len;
struct sockaddr_un clt_addr;
socklen_t clt_addr_len;
struct sockaddr_un srv_addr;
//建立用於通訊的套接字,通訊域為unix通訊域
listen_fd = socket(pf_unix, sock_stream, 0);
if(listen_fd<0){
perror("cannot creat listening socket");
return 1;
//設定伺服器位址引數
srv_addr.sun_family = af_unix;
strncpy(srv_addr.sun_path,unix_domain,sizeof(srv_addr.sun_path)-1);
unlink(unix_domain);
//繫結套接字與伺服器位址資訊
ret = bind(listen_fd,(struct sockaddr *)&srv_addr,sizeof(serv_addr));
if(ret ==-1){
perror("cannot bind server socket");
close(listen_fd);
unlink(unix_domain);
return 1;
//對套接字進行監聽
ret = listen(listen_fd,1);
if(ret == -1){
perror("cannot listen the client connect request");
close(listen_fd);
unlink(unix_domain);
return 1;
printf("begin listening");
//當有連線請求時,呼叫accept函式建立伺服器與客戶機之間的連線
len = sizeof(clt_addr);
com_fd = accept(listen_fd,(sruct sockaddr*)&clt_addr,&len);
if(com_fd < 0){
perror("cannot accept client connect request");
close(listen_fd);
unlink(unix_domain);
return 1;
//讀取並輸出客戶端傳送過來的連線資訊
printf("/n*****===info*****====/n");
for(i=0;i<4;i++){
memset(recv_buf,0 ,1024);
int num = read(com_fd,recv_buf,sizeof(recv_buf);
printf("message from client(%d)):%s/n",num,recv_buf);
close(com_fd);
close(listen_fd);
unlink(unix_domain);
return 0;
1.2 客戶端實現
clt.c為使用套接字在unix域內實現程序間通訊的客戶端程式。相比伺服器端的程式,客戶端較為簡單程式首先通過呼叫socket函式建立通訊所需的套接字,然後,呼叫connect函式來連線伺服器,在成功建立連線後,通過呼叫write函式向伺服器傳送指定的訊息,具體**如下:
//clt.c unix域通訊**示例,客戶端
#include
#include
#incude
#include
#define unix_domain "/tmp/unix.domain"
int main()
int connect_fd;
int ret;
int snd_buf[1024];
int i;
static struct sockaddr_un srv_addr;
connect_fd = socket(pf_unix,sock_stream, 0);
if (connect_fd <0){
perror("cannnot creat communication socket");
return 1;
srv_addr.sun_family = af_unix;
strcpy(&srv_addr.sun_path, unix_domain);
ret = connect(connect_fd,(struct sockaddr*)&srv_addr,sizeof(srv_addr);
if(ret == -1){
perror("cannot connect to the server");
return 1;
memset(snd_buf, 0, 1024);
strcpy(snd_buf,"client");
for(i=0;i<4;i++)
write(connect_fd,snd_buf,sizeof(snd_buf);
close(connect_fd);
return 0;
1.3程式執行結果分析
使用gcc編譯srv.c和clt.c,獲得名為srv和clt的可執行檔案。先執行srv程式,然後執行clt程式,具體輸出如下:
[program@localhost charter13]$ gcc clt.c -o clt
[program@localhost charter13]$ gcc -o srv srv.c
[program@localhost charter13]$ ./srv &
[1] 13450
[program@localhost charter13]$ ./clt &
[2] 13451
[program@localhost charter13]$
*****info*****
message from client (1024)) :message from client
message from client (1024)) :message from client
message from client (1024)) :message from client
message from client (1024)) :message from client
[1]- done ./srv
[2]+ done ./clt
[program@localhost charter13]$
當執行srv程式後,該程式將處於監聽狀態。這時,可以通過netstat命令檢視程式與你想那個情況:
netstat -an|grep /tmp
面向連線與無連線
面向連線與面向無連線是兩種方法,在網路中用於相關網路協議的制定 例如tcp是面向連線的,而udp是面向無連線的 在應用中,它們代表著資料通訊的兩種不同的傳輸資料技術。本文主要指協議與服務。面向連線協議是tcp ip協議族的重要組成部分,面向連線依賴傳送方和接收方之間的顯示通訊和阻塞以管理雙方的資料傳...
白話淺說TCP UDP面向連線,面向無連線的區別
tcp是面向連線的 udp是面向無連線的 就是這種關係了 tcp transmission control protocol,傳輸控制協議 udp user datagram protocol,使用者資料報協議 當ip包通過路由將資料傳輸到目的地時,會根據tcp或udp包頭中的源埠和目的埠資訊,請求...
面向連線的協議 2
面向連線的協議 伺服器端 由圖我們可以看出,伺服器與客戶的區別在於 伺服器必須進行套介面繫結。因為如果伺服器沒有位址,客戶就無法進行連線。s3 的作用在於告訴核心,在某個套介面上監聽並接收請求。伺服器需要監聽連線。下面,我們介紹一下有關的函式,int listen int sockfd,int ba...