• / 30
  • 下载费用:10 金币  

epoll学习笔记.doc

关 键 词:
epoll学习笔记.doc
资源描述:
epoll 学习笔记 epoll 有两种模式,Edge Triggered(简称 ET) 和 Level Triggered(简称 LT).在采用这两种模式时要注意的是,如果采用 ET 模式,那么仅当状态发生变化时才会通知,而采用 LT 模式类似于原来的 select/poll 操作,只要还有没有处理的事件就会一直通知.以代码来说明问题:首先给出 server 的代码,需要说明的是每次 accept 的连接,加入可读集的时候采用的都是 ET 模式,而且接收缓冲区是 5 字节的,也就是每次只接收 5 字节的数据:#include #include #include #include #include #include #include #include #include using namespace std;#define MAXLINE 5#define OPEN_MAX 100#define LISTENQ 20#define SERV_PORT 5000#define INFTIM 1000void setnonblocking(int sock){int opts;opts=fcntl(sock,F_GETFL);if(optsnew(“$host:$port“) or die “create socket error $@“;my $msg_out = “1234567890“;print $socket $msg_out;print “now send over, go to sleep \n“;while (1){sleep(1);}运行 server 和 client 发现,server 仅仅读取了 5 字节的数据,而 client 其实发送了 10 字节的数据,也就是说,server 仅当第一次监听到了 EPOLLIN 事件,由于没有读取完数据,而且采用的是 ET 模式,状态在此之后不发生变化,因此server 再也接收不到 EPOLLIN 事件了.(友情提示:上面的这个测试客户端,当你关闭它的时候会再次出发 IO 可读事件给 server,此时 server 就会去读取剩下的 5 字节数据了,但是这一事件与前面描述的 ET 性质并不矛盾.)如果我们把 client 改为这样:#!/usr/bin/perluse IO::Socket;my $host = “127.0.0.1“;my $port = 5000;my $socket = IO::Socket::INET-new(“$host:$port“) or die “create socket error $@“;my $msg_out = “1234567890“;print $socket $msg_out;print “now send over, go to sleep \n“;sleep(5);print “5 second gone send another line\n“;print $socket $msg_out;while (1){sleep(1);}可以发现,在 server 接收完 5 字节的数据之后一直监听不到 client 的事件,而当 client 休眠 5 秒之后重新发送数据,server 再次监听到了变化,只不过因为只是读取了 5 个字节,仍然有 10 个字节的数据(client 第二次发送的数据)没有接收完.如果上面的实验中,对 accept 的 socket 都采用的是 LT 模式,那么只要还有数据留在 buffer 中,server 就会继续得到通知,读者可以自行改动代码进行实验.基于这两个实验,可以得出这样的结论:ET 模式仅当状态发生变化的时候才获得通知,这里所谓的状态的变化并不包括缓冲区中还有未处理的数据,也就是说,如果要采用 ET 模式,需要一直 read/write 直到出错为止,很多人反映为什么采用ET 模式只接收了一部分数据就再也得不到通知了,大多因为这样;而 LT 模式是只要有数据没有处理就会一直通知下去的.补充说明一下这里一直强调的“状态变化“是什么:1)对于监听可读事件时,如果是 socket 是监听 socket,那么当有新的主动连接到来为状态发生变化;对一般的 socket 而言,协议栈中相应的缓冲区有新的数据为状态发生变化.但是,如果在一个时间同时接收了 N 个连接(N1),但是监听socket 只 accept 了一个连接,那么其它未 accept 的连接将不会在 ET 模式下给监听 socket 发出通知,此时状态不发生变化;对于一般的 socket,就如例子中而言,如果对应的缓冲区本身已经有了 N 字节的数据,而只取出了小于 N 字节的数据,那么残存的数据不会造成状态发生变化.2)
展开阅读全文
  微传网所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
0条评论

还可以输入200字符

暂无评论,赶快抢占沙发吧。

关于本文
本文标题:epoll学习笔记.doc
链接地址:https://www.weizhuannet.com/p-9828471.html
微传网是一个办公文档、学习资料下载的在线文档分享平台!

微传网博客

网站资源均来自网络,如有侵权,请联系客服删除!

 网站客服QQ:80879498  会员QQ群:727456886

copyright@ 2018-2028 微传网络工作室版权所有

     经营许可证编号:冀ICP备18006529号-1 ,公安局备案号:13028102000124

收起
展开