我已經設置了一個非阻塞連接呼叫的超時,當連接嘗試到一個不會響應的地址時正確超時。 但是,當連接被目的地拒絕時,它似乎不會返回連接被拒絕的呼叫。非阻塞連接呼叫不返回連接拒絕
int x = fcntl(iSock,F_GETFL, 0);
fcntl(iSock,F_SETFL, x | O_NONBLOCK);
fd_set writeFD;
FD_ZERO(&writeFD);
FD_SET(iSock, &writeFD);
timeval timeout;
timeout.tv_sec = 30;
timeout.tv_usec = 0;
errno = 0;
if ((iStat = connect(iSock, (struct sockaddr *)&addr, sizeof(addr))) < 0)
{
if(errno == EINPROGRESS)
{
if(int retval = (select (iSock+1, (fd_set *)NULL, &writeFD, (fd_set *)NULL, (struct timeval *)(&timeout)) > 0))
{
socklen_t len = 0;
int error = 0;
if (getsockopt(iSock, SOL_SOCKET, SO_ERROR, &error, &len) < 0)
return (-1);
if (error == EINPROGRESS)
{
close(iSock);
errno = error;
return (-1);
}
else
{
printf("Connected \n");
return 0;
}
}
else
{
printf("Not Connected - %d\n", errno);
close(iSock);
return iStat;
}
}
else
{
close(iSock);
return iStat;
}
}
從連接調用,它似乎總是返回EINPROGRESS,然後選擇通話將返回> 0誤差設置爲0
當我將其更改爲阻塞連接電話,我得到的立即從connect調用返回CONNECTIONREFUSED的代碼。
請注意,這些書籍用來代替'getsockopt(...,SO_ERROR,...)'執行第二個'connect()'調用;很久以前。 – EJP 2013-05-09 00:11:22