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);

浙公网安备 33010602011771号