老熟女激烈的高潮_日韩一级黄色录像_亚洲1区2区3区视频_精品少妇一区二区三区在线播放_国产欧美日产久久_午夜福利精品导航凹凸

重慶分公司,新征程啟航

為企業提供網站建設、域名注冊、服務器等服務

Linux高級I/O之poll函數及簡單服務器客戶端編程

當需要同時監聽多個文件描述符時,就需要I/O復用函數,I/O復用函數有select、poll、epoll,今天主要使用poll函數。

成都創新互聯是由多位在大型網絡公司、廣告設計公司的優秀設計人員和策劃人員組成的一個具有豐富經驗的團隊,其中包括網站策劃、網頁美工、網站程序員、網頁設計師、平面廣告設計師、網絡營銷人員及形象策劃。承接:成都網站設計、成都做網站、網站改版、網頁設計制作、網站建設與維護、網絡推廣、數據庫開發,以高性價比制作企業網站、行業門戶平臺等全方位的服務。

poll()接受一個指向結構'struct pollfd'列表的指針,其中包括了你想測試的文件描述符和事件。事件由一個在結構中事件域的比特掩碼確定。當前的結構在調用后將被填寫并在事件發生后返回。

函數原型:

#include
int?poll(struct?pollfd?*fds,?nfds_t?nfds,?int?timeout);
struct?pollfd{
????int?fd;?????????/*file?descriptor*/
????short?events;???/*requested?events*/
????short?revents;??/*returned?events*/
}

函數參數:fds是要監聽的fd的數組,nfds是數組個數,timeout 超時時間 -1是阻塞;

函數說用:通過傳入的events的類型去判斷返回的類型是否一致,如果一致就該干事了。

events:

常量

說明

POLLIN

普通或優先級帶數據可讀

POLLRDNORM

普通數據可讀

POLLRDBAND

優先級帶數據可讀

POLLPRI

高優先級數據可讀

POLLOUT

普通數據可寫

POLLWRNORM

普通數據可寫

POLLWRBAND

優先級帶數據可寫

POLLERR

發生錯誤

POLLHUP

發生掛起

POLLNVAL

描述字不是一個打開的文件

接下來是是一個服務器監聽兩個socket的例子:

服務器代碼:

#include
#include??
#include??
#include??
#include??
#include??
#include?
#include
#include
#include

#define?MAX_POLLFD_NUM?2
//#define?SERVER_CONN_IP1?"1.1.1.1"
//#define?SERVER_CONN_IP2?"1.1.1.1"
#define?DEFAULT_PORT?8000
#define?BUFF_MAX?1024

typedef?void(*Server_Rrocess_Thread_Fun)(void?*arg);
/*thread?process?function?define?*/
typedef?struct?sever_thread_fun{
	Server_Rrocess_Thread_Fun?Server_Process_Client_Conn1;
	Server_Rrocess_Thread_Fun?Server_Process_Client_Conn2;
}Poll_Server_Process_Clinet_FUN_t;
/*connect?1?thread?function*/
void?*Poll_Conn1_Process(void?*arg)
{
	unsigned?char?ucBufArr[BUFF_MAX]?=?{0};
	unsigned?long?ulSize?=?0;
	int?connect_fd?;
????printf("come?pthread?conn1?fun?to?proess?conn1\n");
	if(?(connect_fd?=?accept(?*(int*)arg,?(struct?sockaddr*)NULL,?NULL))?==?-1){??
		printf("accept?socket?error:?%s(errno:?%d)",strerror(errno),errno);??
????}
	ulSize?=?recv(connect_fd,?ucBufArr,?BUFF_MAX,?0);??

	if(send(connect_fd,?"Hello,you?are?connected?1!\n",?26,0)?==?-1)??
	perror("send?error");??
	ucBufArr[ulSize]?=?'\0';??
????//sleep(20);
	printf("recv?msg?from?client:?%s\n",?ucBufArr);??
	close(connect_fd);??
	pthread_exit((void*)1);
}
/*connect?1?thread?function*/
void?*Poll_Conn2_Process(void?*arg)
{
	unsigned?char?ucBufArr[BUFF_MAX]?=?{0};
	unsigned?long?ulSize?=?0;	
	int?connect_fd?;
????printf("come?pthread?conn2?fun?to?proess?conn2\n");
	if(?(connect_fd?=?accept(?*(int*)arg,?(struct?sockaddr*)NULL,?NULL))?==?-1){??
		printf("accept?socket?error:?%s(errno:?%d)",strerror(errno),errno);??
????}
	ulSize?=?recv(connect_fd,?ucBufArr,?BUFF_MAX,?0);??

	if(send(connect_fd,?"Hello,you?are?connected?2!\n",?26,0)?==?-1)??
	perror("send?error");??
	ucBufArr[ulSize]?=?'\0';??
???//?sleep(20);
	printf("recv?msg?from?client:?%s\n",?ucBufArr);??
	close(connect_fd);??
	pthread_exit((void*)2);
}
int?main()
{	
????int?poll_ret?=?0;
	pthread_t?thread_conn1;
	pthread_t?thread_conn2;
????/*socket?var*/
	int?server_socket_fd_conn1;
	int?server_socket_fd_conn2;
	struct?sockaddr_in?servaddr_conn1;
	struct?sockaddr_in?serveraddr_conn2;
	/*poll?var*/
????struct?pollfd?pollfd_arr[MAX_POLLFD_NUM];
	/*init?thread?fun*/
	Poll_Server_Process_Clinet_FUN_t?server_conn_handel;
	server_conn_handel.Server_Process_Client_Conn1?=?Poll_Conn1_Process;
	server_conn_handel.Server_Process_Client_Conn2?=?Poll_Conn2_Process;
	/*create?two?server?socket*/
	if(?(server_socket_fd_conn1?=?socket(AF_INET,?SOCK_STREAM,?0))?==?-1?){??
????printf("create?socket?conn1?error:?%s(errno:?%d)\n",strerror(errno),errno);??
????exit(0);??
????}??
	if(?(server_socket_fd_conn2?=?socket(AF_INET,?SOCK_STREAM,?0))?==?-1?){??
????printf("create?socket?conn2?error:?%s(errno:?%d)\n",strerror(errno),errno);??
????exit(0);??
????}??
	
????/*init?socket?1?for?conn1*/??
????memset(&servaddr_conn1,?0,?sizeof(servaddr_conn1));??
????servaddr_conn1.sin_family?=?AF_INET;??	
????servaddr_conn1.sin_addr.s_addr?=?htonl(INADDR_ANY);?
????servaddr_conn1.sin_port?=?htons(DEFAULT_PORT);?
//	if(?inet_pton(AF_INET,?SERVER_CONN_IP1,?&servaddr_conn1.sin_addr.s_addr)?<=?0){??
?//???printf("inet_pton?error?for?%s\n",SERVER_CONN_IP1);??
??//??exit(0);??
???//?}??
	/*init?socket?2?for?conn2*/??
	memset(&serveraddr_conn2,?0,?sizeof(serveraddr_conn2));??
????serveraddr_conn2.sin_family?=?AF_INET;??
????serveraddr_conn2.sin_addr.s_addr?=?htonl(INADDR_ANY);?
????serveraddr_conn2.sin_port?=?htons(DEFAULT_PORT+1);?
//	if(?inet_pton(AF_INET,?SERVER_CONN_IP2,?&serveraddr_conn2.sin_addr.s_addr)?<=?0){??
?//???printf("inet_pton?error?for?%s\n",SERVER_CONN_IP2);??
??//??exit(0);??
???//?}??
??
????/*bind?connect?1?socket*/
????if(?bind(server_socket_fd_conn1,?(struct?sockaddr*)&servaddr_conn1,?sizeof(servaddr_conn1))?==?-1){??
????printf("bind?socket?error1:?%s(errno:?%d)\n",strerror(errno),errno);??
????exit(0);??
????}??
	/*bind?connect?2?socket*/
	if(?bind(server_socket_fd_conn2,?(struct?sockaddr*)&serveraddr_conn2,?sizeof(serveraddr_conn2))?==?-1){??
????printf("bind?socket?error2:?%s(errno:?%d)\n",strerror(errno),errno);??
????exit(0);??
????}??
????/*listen?connect?1*/??
????if(?listen(server_socket_fd_conn1,?10)?==?-1){??
????printf("listen?socket?error:?%s(errno:?%d)\n",strerror(errno),errno);??
????exit(0);??
????}??
	/*listen?connect?2*/??
????if(?listen(server_socket_fd_conn2,?10)?==?-1){??
????printf("listen?socket?error:?%s(errno:?%d)\n",strerror(errno),errno);??
????exit(0);??
????}??
	pollfd_arr[0].events?=?POLLRDNORM;/*only?read?event*/
	pollfd_arr[0].fd?=?server_socket_fd_conn1;
	
	pollfd_arr[1].events?=?POLLRDNORM;/*only?read?event*/
	pollfd_arr[1].fd?=?server_socket_fd_conn2;
????while(1)
	{
		poll_ret?=?poll(?pollfd_arr,?MAX_POLLFD_NUM,-1);
		if(?pollfd_arr[0].revents?&?POLLRDNORM?)
		{
			/*connect?1?process?task*/
			pthread_create(?&thread_conn1,?NULL,?server_conn_handel.Server_Process_Client_Conn1,?(void?*)(&pollfd_arr[0].fd));
		}
		if(?pollfd_arr[1].revents?&?POLLRDNORM?)
		{
			/*connect?2?process?task*/
			pthread_create(?&thread_conn2,?NULL,?server_conn_handel.Server_Process_Client_Conn2,?(void?*)(&pollfd_arr[1].fd));
		}
		sleep(1);
	}
	return?0;
}

客戶端代碼:

#include??
#include??
#include??
#include??
#include??
#include??
#include??
??
#define?BUFF_MAX?1024
#define?DEFAULT_PORT?8000
int?main(int?argc,?char**?argv)??
{??
????int????sockfd,?n,rec_len;??
????char????recvline[BUFF_MAX],?sendline[BUFF_MAX];??
????char????buf[BUFF_MAX];??
????struct?sockaddr_in????servaddr;??
??
??
????if(?argc?!=?2){??
????printf("usage:?./client?\n");??
????exit(0);??
????}??
??
????/*create?socket*/
????if(?(sockfd?=?socket(AF_INET,?SOCK_STREAM,?0))?

解釋:服務器端監聽 ip 127.0.0.1 port 8000和ip 127.0.0.1 port 8001

結果演示:

Linux 高級I/O之poll函數及簡單服務器客戶端編程


網站欄目:Linux高級I/O之poll函數及簡單服務器客戶端編程
網址分享:http://www.xueling.net.cn/article/jisjsj.html

其他資訊

在線咨詢
服務熱線
服務熱線:028-86922220
TOP
主站蜘蛛池模板: 91cao在线 | 免费a在线看 | 欧洲成人在线观看 | FREEXXXXHD麻豆精品A∨ | 美女视频黄频a美女大全 | 亚洲日本香蕉视频 | 日韩欧美国产免费 | 在线观看国产h | 国产美女精品AⅤ在线播放 精品伊人久久久久7777人 | 在线成人免费观看视频 | 国产91专区 | 亚洲国产精品无码成人A片在线 | 成人欧美一区二区三区黑人麻豆 | 国产在线观看午夜福利片 | 97av中文字幕 | www.youjizz.com最新 | 汉服女装齐胸襦裙被c到喷水 | 日日噜噜噜噜人人爽亚洲精品 | 日韩免费视频中文字幕 | 偷拍自拍第二页 | 亚洲欧美日韩视频高清专区 | 一本色道久久99精品综合 | 日韩高清中文字幕 | 搡女人真爽免费视频网站波兰美女 | 亚洲欧洲精品一区二区三区四区 | 久久久久欠精品国产毛片国产毛生 | 91草在线视频| 一级做a爰片久久高潮 | 精品久久AⅤ人妻中文字幕 亚洲精品久久无码AV片软件 | 国产高清www午色夜 亚洲精品成人网久久久久久 | 国产精品99久久久久久久女警 | A一级片中文字幕 | 国产精品中文久久久久久久 | 国产乱了伦视频大全亚琴影院 | 国产无遮挡裸体免费视频A片 | 成人福利视频网站 | 福利社一区二区 | 在线精品亚洲一区二区不卡 | 久久精品草 | 亚洲熟妇色XXXXX欧美老妇Y | 亚洲欧美久久久 |