我們知道ET模式下的事件觸發(fā)需要遇到EAGAIN結(jié)束,那么在tcp服務(wù)中不管是listen socket還是data
socket,,都需要做相應(yīng)處理,,特別是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) ; } } |
|