欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

相关标签: Linux之美