非阻塞连接呼叫不返回连接拒绝
问题描述:
我已经设置了一个非阻塞连接呼叫的超时,当连接尝试到一个不会响应的地址时正确超时。 但是,当连接被目的地拒绝时,它似乎不会返回连接被拒绝的呼叫。非阻塞连接呼叫不返回连接拒绝
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的代码。
答
socklen_t len = 0;是不正确的。 这需要设置为 socklen_t len = sizeof(int);
设置固定的问题,这个值和正确的返回码(CONNREFUSED)从选择呼叫设置
+0
为什么sizeof(int)?听起来很愚蠢。 – 2013-11-09 17:05:03
答
我认为socklen_t len = sizeof(error);
优于sizeof(int)
。
这是一样的结果。
请注意,这些书籍用来代替'getsockopt(...,SO_ERROR,...)'执行第二个'connect()'调用;很久以前。 – EJP 2013-05-09 00:11:22