多路io复用 poll

函数原型int poll(struct pollfd *fds, nfds_t nfds, int timeout);
struct pollfd *fds 表示一个结构体数组,是一个传入传出参数
nfds_t nfds 表示的是我们需要用到数组下标+1
以下为结构体
struct pollfd {
               int   fd;         /* file descriptor */
               short events;     /* requested events */
               short revents;    /* returned events */  };
传入时候管前两个fd events,传出的时候管最后一个revents
过程
poll里有三种事件,pollin(读事件) pollout(写事件) pollerr(异常事件)
需要让poll帮助我们监听lfd读事件
struct pollfd fds
fds[0].fd = lfd;
fds[0].events = POLLIN ;
int ret = poll(fds,nfds,-1)
lfd(Fd = 3)后面的文件描述符系统帮我们管理,这里的nfds就传4,就是我们需要用到数组下标+1
返回的时候会更改Revents如果发生了Revents = POLLIN,如果未发生Revents = 0;
返回之后判断
if(fds[0].revent & POLLIN)
{
    int cfd = accept();
    fds中选择一个合适的位置将cfd设置监听
}
之后在cfd里遍历
for(int i = 1;i<4;i++)
{
    if(fds[i].revents & POLLIN)
    {
        cfd的事件触发
        read(fds[i].fd,buf,sizeof(buf));
    }
}
select和poll的区别
    select受限只能1024个文件描述符, poll可以监听更多文件描述符
    poll比select浪费更多内存资源,有大量数据拷贝
多路io复用poll实现代码
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/select.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <poll.h>
#define BUFSIZE 1024
#define PORT 8000
int main()
{
    int lfd, cfd;
        char buf[BUFSIZE];
        socklen_t addrlen;
        lfd = socket(AF_INET, SOCK_STREAM, 0);
        struct sockaddr_in ser_addr, cli_addr;
        ser_addr.sin_family = AF_INET;
        ser_addr.sin_port = htons(PORT);
        ser_addr.sin_addr.s_addr = htonl(INADDR_ANY);
        bind(lfd, (struct sockaddr*)&ser_addr, sizeof(ser_addr));
        listen(lfd,128);
        socklen_t len = sizeof(cli_addr);
        //已经有了一个文件描述符需要监听lfd
        struct pollfd fds[1050];
        int i = 0;
        for(i = 0;i<1050;i++)
        {
            fds[i].fd = -1;
            fd[i].events = 0;
        }
        int maxi;
        fds[0].fd = lfd;
        fds[0].evemt = POLLIN;
        maxi = 0;
        while(1)
        {
               int ret = poll()
        }
    return 0;
}
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值