如何判断非阻塞套接字连接成功

发布网友

我来回答

2个回答

热心网友

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<0)
    {
         //ret == -1   errno == EINPROGRESS  判断socket可写和异常
        &#8205;int &sockfd = sock_fd;
        fd_set mask, mask_expt;
        FD_ZERO(&mask);
        FD_SET(sockfd,&mask);
        FD_ZERO(&mask_expt);&#8205;
        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 成功

热心网友

我也来抽个热闹,很久没有见到NIO问题。这位同学,你在生成NIO客户端连接的时候 有一个参数是“是否同步连接”,你可以借这个来确认连接成功。其次,否则,你就只有像刚才那位老兄说的那样select or selectNow 来了解 连接状况。记得,当select or selectNow 之后有个判断连接是否有效的方法 你可以找下,它应该很有用,希望能够帮助到你。
是否可以解决您的问题?追问判断方法我知道,只是不知道在select判断可读后是否还需要调用getsockopt进一步判断,还有在有些地方见到判断可读或可写的,我记得好像只有在可读写下才调用getsockopt进一步判断,因为可读写也可能是连接不成功。所以现在我的问题是什么时候才需要调用getsockopt进一步判断,还有select是判断可写,还是判断可读,还是判断可读写?不过我发现你好像是粘贴的回答吧,这样可不好啊

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com