12ET与LT分析测试

一、总的概况

LT: 水平触发/低速模式,这个事件没处理完,就会被 一直触发;
ET: 边缘触发/告诉模式,这个事件通知只会出现一次;
普遍认为ET比LT效率高一些,但是 ET编程难度比LT大一些;

思考:
1.为什么ET模式事件只触发一次?[事件被扔到双向链表中一次,被epoll_wait取出后就干掉]
2.LT模式事件会触发多次呢?[事件如果没有处理完,那么事件会被'多次往双向链表中扔']

测试位置: 在函数void CSocekt::ngx_wait_request_handler(lpngx_connection_t c)

使用比较:
如果收发数据包有"固定格式",那么建议采取LT; 如果收发数据包没有固定格式,可以考虑采用ET模式;
解释: 固定格式的数据包,的长度是固定的的,我们程序的recv(c->fd,buf,* ,0); 的buf的尺寸就可以固定,就不会造成二次读,第二次LT模式的触发。

二、ET

ET下没有读完: 只读一次,而且,未读完的数据还是在内核缓冲区中,只有再次除非这个套接字的读事件,才能再一次进入这个缓冲区读取数据

unsigned char buf[10]={0};
memset(buf,0,sizeof(buf));
int n = recv(c->fd,buf,2,0); //每次只收两个字节
ngx_log_stderr(0,"OK,收到的字节数为%d,内容为%s",n,buf);

ET下读完: 用循环的方式去读

 unsigned char buf[10]={0};
 memset(buf,0,sizeof(buf));
 do
 {
     int n = recv(c->fd,buf,2,0); //每次只收两个字节    ET模式下,如果没有数据可接收,则recv会返回-1
     if(n == -1 && errno == EAGAIN)
         break; //数据收完了
     else if(n == 0)
         break;
     ngx_log_stderr(0,"OK,收到的字节数为%d,内容为%s",n,buf);
 }while(1);

三、LT

 //LT测试代码:水平触发/低速模式,这个事件没处理完,就会被 一直触发;
 //
 unsigned char buf[10]={0};
 memset(buf,0,sizeof(buf));  
 int n = recv(c->fd,buf,2,0);
 if(n  == 0)
 {
     //连接关闭
     ngx_free_connection(c);
     close(c->fd);
     c->fd = -1;
 }
 ngx_log_stderr(0,"OK,收到的字节数为%d,内容为%s",n,buf);
posted @ 2022-03-10 09:57  豪崽_ZH  阅读(246)  评论(0)    收藏  举报