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;
}