我們知道ET模式下的事件觸發(fā)需要遇到EAGAIN結(jié)束,那么在tcp服務中不管是listen socket還是data socket,都需要做相應處理,特別是listen socket ,很容易被遺漏 , 新連接未處理,從而出現(xiàn)close_wait狀態(tài)的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) ;
}
}