gpt4 book ai didi

linux - 非阻塞连接调用不返回连接被拒绝

转载 作者:太空宇宙 更新时间:2023-11-04 11:23:24 24 4
gpt4 key购买 nike

我在非阻塞连接调用上设置了超时,当尝试连接到一个不会响应的地址时,它会正确超时。但是,当连接被目的地拒绝时,它似乎不会返回连接被拒绝的调用。

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

从 connect 调用来看,它似乎总是返回 EINPROGRESS,然后 select 调用将返回 > 0,错误设置为 0。

当我将其更改为阻塞连接调用时,我会立即从连接调用中获得 CONNECTIONREFUSED 的返回码。

最佳答案

socklen_t len = 0;是不正确的。这需要设置为 socklen_t len = sizeof(int);

设置这个值解决了这个问题,正确的返回码 (CONNREFUSED) 是从 select 调用中设置的

关于linux - 非阻塞连接调用不返回连接被拒绝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16440651/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com