为什么ET模式下socket文件描述符要设置成非阻塞的?
程序员文章站
2022-04-19 16:06:07
...
网上许多地方说的都根本看不懂。。。
原因其实很简单,在主流程中,是
while( 1 )
{
int ret = epoll_wait( epollfd, events, MAX_EVENT_NUMBER, -1 );
if ( ret < 0 )
{
printf( "epoll failure\n" );
break;
}
lt( events, ret, epollfd, listenfd );
//et( events, ret, epollfd, listenfd );
}
如果设置成lt模式,只要检测到数据没读完,必定会调用recv
如果设置成et模式,是下面的代码
while( 1 )
{
memset( buf, '\0', BUFFER_SIZE );
int ret = recv( sockfd, buf, BUFFER_SIZE-1, 0 );
if( ret < 0 )
{
if( ( errno == EAGAIN ) || ( errno == EWOULDBLOCK ) )
{
printf( "read later\n" );
break;
}
close( sockfd );
break;
}
如果设置成阻塞的,由于使用了while (1),在最后一次读写后线程会阻塞。。。
上一篇: NCNN 跑benchmark方法