50-使用 epoll 改写服务器

使用 epoll 改写服务器,会让我们的程序变得更加简单、高效。

1. 程序路径

代码托管在 gitos 上,请使用下面的命令获取:

git clone https://git.oschina.net/ivan_allen/unp.git

如果你已经 clone 过这个代码了,请使用 git pull 更新一下。本节程序所使用的程序路径是 unp/program/echo/multiplexing_epoll_server

2. 回忆 epoll 系列函数

主要有三个,分别是 epoll_create、epoll_ctl、epoll_wait. 有关 epoll 的具体用法,请参考《Linux 环境编程学习笔记》第十二章内容。

#include <sys/epoll.h>

int epoll_create(int size);
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout);

3. 使用 epoll 改写服务器

同样的,这里只贴出伪代码。

void server_routine() {
   // ...
   int epfd;
   struct epoll_event evts[5]; // 接收 epoll_wait 的返回值
   struct epoll_event ev;
   listen(listenfd);

   epfd = epoll_create(1); // 参数只要大于 0 就行了

   // 添加 listenfd 到 epoll
   ev.data.fd = listenfd;
   ev.events = EPOLLIN;
   epoll_ctl(epfd, EPOLL_CTL_ADD, listenfd, &evt);

   while(1) {
     // 监听事件
     nready = epoll_wait(epfd, evts, 50);
     for (i = 0; i < nready, ++i) {
       // 查看是否有新的连接
       if (evts[i].data.fd == listenfd && (evts[i].events & EPOLLIN)) {
         sockfd = accept(listenfd);
         ev.data.fd = sockfd;
         ev.events = EPOLLIN;
         // epoll_ctl(epfd, EPOLL_CTL_ADD, listenfd, &evt);
         // 此行原来有误,应该是添加 sockfd 而非 listenfd.感谢网友 Neymar 指出,修改如下:
         epoll_ctl(epfd, EPOLL_CTL_ADD, sockfd, &evt);
       }
       // 与客户端交互数据
       else if (evts[i].events & EPOLLIN) {
         ret = doServer(evts[i].data.fd);
         if (ret <= 0) {
           // 客户端关闭,则将其从 epoll 中删除
           epoll_ctl(epfd, EPOLL_CTL_DEL, evts[i].data.fd, NULL);
           close(evts[i].data.fd);
         }
       }
     }
   }
}

4. 程序运行结果


这里写图片描述
图1 运行结果

5. 总结

  • 掌握 epoll 在网络编程中的应用
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值