其他分享
首页 > 其他分享> > 多路转接poll

多路转接poll

作者:互联网

文章目录

poll

poll函数介绍

 #include <poll.h>
 int poll(struct pollfd *fds, nfds_t nfds, int timeout);     

第一个参数fds,是一个结构体数组,因为数组传参会退化成指针。

struct pollfd {
               int   fd;         /* file descriptor */
               short events;     /* requested events */
               short revents;    /* returned events */
           };

第二个参数:
nfds代表fd的数量。

第三个参数:

返回值:

事件的设置

使用poll

监测标准输入:

  1 #include <iostream>
  2 #include <poll.h>
  3 #include <cstdlib>
  4 #include <unistd.h>
  5 
  6 using namespace std;
  7 
  8 int main(){
  9   //int poll(struct pollfd *fds, nfds_t nfds, int timeout);                                          
 10   struct pollfd fds[1];
 11   fds[0].fd = 0;
 12   fds[0].events = POLLIN;
 13   fds[0].revents = 0; //revents 可以不设置,由内核设置。
 14 
 15     char buf[1024] = {0};
 16   for(;;){
 17     cout << "poll begin..." << endl;
 18     int ret = poll(fds, 1, 1000);  //timeout的单位是毫秒!
 19     if(ret < 0){
 20       cerr << "poll error" << endl;
 21       exit(1);
 22     }
 23     else if(ret == 0){
 24       cout << "timeout..." << endl;
 25       continue;
 26     }
 27     else{
 28         ssize_t ss = read(0, buf, sizeof(buf) - 1);
 29         buf[ss] = 0;
 30         cout << "echo # "<< buf << endl;
 31     }
 32   }

poll的伪代码:

struct polllfd fds[MAX];  //MAX的值由你来设定;
//这里将fds[i].fd都初始化成一个负数,用来标识未被使用!
fds[0].fd = lsock;
fds[0].events = POLLIN;

for(;;){
	poll(fds, MAX, 1000);
	for(int i = 0; i < MAX; ++i){
		if(fds[i].fd == FLAG) //FLAG是你设置的负数,表示该位置未被使用
		continue;
		else if(fds[i].events & POLLIN) //这里还可以检测多种事件,
		{
			if(fds[i].fd == lsock) //连接
			{
				sock add to fds; //是连接就加入到fds中,然后设置想要检测的事件。
				sock add events
			}
			else
			{/** 处理数据 **/}
		}
		else if(fds[i].events & POLLOUT) //处理写事件,和上面一样的逻辑!
		{/* 略 */}
	}
}

poll优缺点

缺点:

多路转接

不要神话多路转接:

多路转接还要考虑上层协议:

标签:多路,fds,转接,fd,poll,events
来源: https://blog.csdn.net/qq_53558968/article/details/121705070