为什么ET模式下socket文件描述符要设置成非阻塞的?

网上许多地方说的都根本看不懂。。。

原因其实很简单,在主流程中,是

    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),在最后一次读写后线程会阻塞。。。

发布了81 篇原创文章 · 获赞 4 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/m0_37313888/article/details/104866779