去评论
推扬网

王李丹:如何判断非阻塞模式的socket连接是否可读可写

admin
2020/08/11 18:07:51

祝永平的回答:

1.设置socket非阻塞 2.connect-----立即返==0 connect功 ??==?-1?&&?errno=?EINPROGRESS 3.用select判断写异(更加严谨) 4.?if?(?写?||?现异?)---关闭socket else{ //写?且异??用getsocketopt判断错误码 errno?==?0??;?//connect?success } //附代码 仅供参考 ????unsigned?long?ul?=?1; ????ioctl(sock_fd,?FIONBIO,?&ul);??//设置非阻塞模式 ????ret?=?::connect(sock_fd,?(struct?sockaddr?*)&addr,?sizeof(sockaddr_in)); ????if(ret<0?&&?errno!=EINPROGRESS) ????{ //连接失败 ????????::close(m_file); return?ret; ????} ????else?if(ret/ret?==?-1???errno?==?EINPROGRESS??判断socket写异 ?????????int?&sockfd?=?sock_fd; ????????fd_set?mask,?mask_expt; ????????FD_ZERO(&mask); ????????FD_SET(sockfd,&mask); ????????FD_ZERO(&mask_expt);? ????????FD_SET(sockfd,&mask_expt); ????????struct?timeval?timeout; ????????timeout.tv_sec=0; ????????timeout.tv_usec=50000;?????????????//?50?ms'?latency ????????if(select(sockfd?+?1,?NULL,?&mask,?&mask_expt,?&timeout)?>?0) ????????{ if(!FD_ISSET(sockfd,?&mask)?||??//套接字绪 FD_ISSET(sockfd,?&mask_expt))??//异套接字绪 { ::close(sockfd); return?ret; } ???????? int?error?=?-1; ????????????????int?len?=?sizeof(int); //non-blocking?socket?in?progress?step?3:?check?result? #ifdef?HP_UX getsockopt(sockfd,SOL_SOCKET,SO_ERROR,&error,?&len); #else????//?linux getsockopt(sockfd,SOL_SOCKET,SO_ERROR,&error,(socklen_t*)&len); #endif ????????????if(?0?==?error?) ????????????{??????????? ret?=?0;?//?connected?ok ????????????} ????????????else ????????????{ ::close(sockfd); return?ret; ????????????} ????????}else{//socsket写?或异??退 ::close(sockfd); return?ret; } ????} ???? ????//connect

老神仙的回答:

搜一下:如何判断非阻塞模式的socket连接是否可读可写