c tcpclient连接错误,关于套接字,然后选择

时间:2018-08-07 05:32:25

标签: c sockets

TcpClient:

首先,我知道连接将会失败,因为我测试的IP地址为127.0.0.1。

当我设置sockfd id not block时,我开始连接服务器并设置timeout = 6; select将立即返回,然后我测试sockfd是否可以读写。

我可以理解sockfd为什么可写,因为当连接失败时, sockfd会写,但是我不明白为什么sockfd可以读,原因 因为sockfd发生错误,所以可以读取?

struct timeval st;
st.tv_sec = m_timeout;
st.tv_usec = 0;
fd_set rdset,wrset;
FD_ZERO(&rdset);
FD_SET(m_sockfd,&rdset);
wrset = rdset;
printf("m_timeout = %d\n",m_timeout);
ret = select(m_sockfd+1,&rdset,&wrset,NULL,m_timeout?&st:NULL);
if(ret == 0){
    close(m_sockfd);
    printf("connect timeout");
    return -1;
}        
else if(ret < 0){
    my_err("select error");
}
else{
    printf("ret = %d\n",ret);
    if(FD_ISSET(m_sockfd,&rdset) || FD_ISSET(m_sockfd,&wrset))
    {   
        int iError = 0;
        int iLen = sizeof(iError);
        if(getsockopt(m_sockfd,SOL_SOCKET,SO_ERROR,&iError,(socklen_t*)&iLen)<0 )    {
            return -1;
         }
        if(iError){
            errno = iError;
            printf("iError = %d,%s\n",iError,strerror(iError));
            return -1;
        }
    }
    else{
        printf("???\n");
        return -1;
    }
}
if(fcntl(m_sockfd,F_SETFL,flag) < 0){
    close(m_sockfd);
    return -1;
}

0 个答案:

没有答案