我們在linux 應用開發中,如果需要實現程序間通訊的多客戶端介面,就需要引入select 和epoll 相關機制了,本文介紹下epoll的功能的實現。
多客戶端使用場景,比如我們需要開發乙個庫介面,提供給客戶呼叫,那麼使用域套接字實現程序間通訊,就必須在service端引入多路復用,否則庫功能就只能被乙個程序使用了。
注意事項:
socket service 位址被占用,bind urc service unix udp socket failure: address already in use 報這個解決方法
刪除 原位址檔案
配置setsockopt(sockfd,sol_socket,so_reuseaddr,&on,sizeof(on)
service端
#
include
#include
#include
#include
#include
#include
#include
#include
#define
dbg_printf(.
..)printf
("[%s.%d]"
,__func__
,__line__);
printf
(__va_args__)
#define
unix_socket_file
"/home/linux/test/socket/temp.file"
static
int sockfd =0;
static
struct
sockaddr_un servaddr,cliaddr;
intmain
(int argc,
const
char
*ar**)
if(access
(unix_socket_file,f_ok)==0
)memset
(&servaddr,0,
sizeof
(servaddr));
servaddr.sun_family = af_unix;
strcpy
(servaddr.sun_path,unix_socket_file);if
(0!=bind
(sockfd,
(struct
sockaddr*)
&servaddr,
sizeof
(servaddr)))
if(0!=
listen
(sockfd,10)
)int clilen =
sizeof
(cliaddr.sun_family)
+strlen
(cliaddr.sun_path);/*
if((connfd = accept(sockfd,(struct sockaddr *)&cliaddr,(socklen_t *)&clilen)) == -1)
dbg_printf("accept success connfd = %d \n",connfd);
*/char recvbuf[64]
;int n =0;
int epfd;
epfd =
epoll_create
(100);
struct
epoll_event ev;
ev.events= epollin;
ev.data.fd = sockfd;
//將sockfd 新增到 監控事件的表中
epoll_ctl
(epfd,epoll_ctl_add,sockfd,
&ev)
;int datafd =0;
int i =0;
struct
epoll_event evrdy[
100]
;while(1
)else
//程序間通訊描述符
else
if(n ==0)
else
if(n >0)
}}}close
(sockfd)
;return0;
}
client端#
include
#include
#include
#include
#include
#include
#include
#define
dbg_printf(.
..)printf
("[%s.%d]"
,__func__
,__line__);
printf
(__va_args__)
#define
unix_socket_file
"/home/linux/test/socket/temp.file"
static
int sockfd =0;
static
struct
sockaddr_un servaddr,cliaddr;
intmain
(int argc,
const
char
*ar**)
memset
(&servaddr,0,
sizeof
(servaddr));
servaddr.sun_family = af_unix;
strcpy
(servaddr.sun_path,unix_socket_file)
;int serlen =
sizeof
(servaddr.sun_family)
+strlen
(servaddr.sun_path);if
(connect
(sockfd,
(struct
sockaddr*)
&servaddr,serlen)==-
1)dbg_printf
("conect success \n");
char recvbuf[64]
;char sendbuf[64]
;while(1
)close
(sockfd)
;return0;
}
編譯上面檔案為service 和client
client 我修改 傳送內容 hello world 和 i love you ,編譯生成client1 和client2,客戶端與service通訊, 測試如下
多客戶端套接字實驗之執行緒響應
學習過計算機網路的同學,知道三次握手和四次揮手的同學可以略過下面的解釋。何為套接字,你讓乙個人找到你家在哪,那麼需要的就是位址,何為位址 哪個省 哪個市 哪個小區 哪一棟樓 哪個門牌號 那麼計算機網路通訊世界中的套接字就是如此,這裡記住它就是乙個ip位址 埠號。不深究其原理,懂的意思就行,深究清出門...
QTcpServer實現多客戶端連線
qtcpserver使用請見 qtcpsocket qt使用tcp通訊實現服務端和客戶端 qtcpserver類預設提供的只有無引數的newconnection的訊號,這樣雖然知道有人連線了,並且可以通過nextpendingconnection獲取連線的socket,但並不便於管理,尤其是在連線斷...
同步客戶端套接字示例
同步客戶端套接字示例 下面的示例程式建立乙個連線到伺服器的客戶端。該客戶端是用同步套接字生成的,因此掛起客戶端應用程式的執行,直到伺服器返回響應為止。該應用程式將字串傳送到伺服器,然後在控制台顯示該伺服器返回的字串。using system using system.net using system...