使用epoll的ET模式下的tcp服务处理特点

使用epoll的ET模式下的tcp服务处理特点
我们知道ET模式下的事件触发需要遇到EAGAIN结束,那么在tcp服务中不管是listen socket还是data socket,都需要做相应处理,特别是listen socket ,很容易被遗漏 , 新连接未处理,从而出现close_wait状态的socket 。
另外错误识别上,EAGAIN和EINTR一定要处理好,如果是主动连接的data socket 在non-block下还要处理EINPROGRESS 。
listen socket 处理
     while ( 1 )
    {
        
int  cfd  =  accept(GetFD(),(sa_t * ) & caddr, & clen) ;
        
if  ( cfd   ==   - 1   ) 
        {
            
if  ( errno  ==  EAGAIN )  return   0  ;
            //other else  continue or close the socket
            //
else   if  ( errno  ==  EINTR )  continue  ;
            // return   - 1  ;
        }
        set_nonblock(cfd) ;
        
// set_sock_nodelay(cfd) ;
        
// set_sock_linger(cfd) ;
         if  ( OnNewClient(cfd)  !=   0  )
        {
            close(cfd) ;
        }
    }


你可能感兴趣的:(使用epoll的ET模式下的tcp服务处理特点)