原创作者: iunknown   阅读:3673次   评论:0条   更新时间:2011-05-26    
libevent - an event notification library
http://www.monkey.org/~provos/libevent/
http://www.monkey.org/~provos/libevent/event3.html

《unix网络编程》 (第二版,中文版)
27.4 TCP 迭代服务器程序
6.8 TCP 回射服务器程序(修订版)
6.11 TCP 回射服务器程序(再修订版)

Page 141 的代码去掉错误处理之后的大概流程如下
for( ; ; ) {
  nready = select( maxfd + 1, &rset, NULL, NULL, NULL );
  for( i = 0; i <= maxi; i++ ) {
    sockfd = client[i];
    if( FD_ISSET( sockfd, &rset ) ) {
      n = read( sockfd, line, MAXLINE );
      write( sockfd, line, n );

      if( --nready <= 0 ) break;
    }
  }
}


Page 148 的代码去掉错误处理之后的大概流程如下
for( ; ; ) {
  nready = poll( client, maxi + 1, INFTIM );
  for( i = 1; i <= maxi; i++ ) {
    sockfd = client[i].fd;
    if( client[i].revents & POLLRDNORM ) {
      n = read( sockfd , line, MAXLINE );
      write( sockfd, line, n );

      if( --nready <= 0 ) break;
    }
  }
}


对比上面的两段程序,基本的结构非常相似。
libevent 的工作就是把这个结构封装了起来,包括以下几个方面
1.主循环结构
2.封装了底层不同的 IO 复用机制,比如 select,poll,epoll,等
3.由于系统默认的 TCP timeout 时间比较长(典型的是 2 小时),为了尽量避免服务器受到 DOS 攻击,需要在应用层建立适当的 timeout 机制。上面的代码中并没有实现这个机制,但是在 libevent 也包含了 timeout 机制。

使用了 libevent 之后,使得开发人员可以从上面的问题中解脱出来,从而专注于和业务相关的代码。

一个更方便使用的,基于 libevent 的半同步半异步服务器框架:http://iunknown.iteye.com/blog/59804
评论 共 0 条 请登录后发表评论

发表评论

您还没有登录,请您登录后再发表评论

文章信息

Global site tag (gtag.js) - Google Analytics