gpt4 book ai didi

c++ - getsockopt() 在非阻塞 connect()+select() 流程中返回 EINPROGRESS

转载 作者:搜寻专家 更新时间:2023-10-30 23:50:47 62 4
gpt4 key购买 nike

更新:

我的错。我得到的错误是 ECONNREFUSED 而不是 EINPROGRESS。在检查了 error 变量后,我发现它大于 0,我打印了 errno 而不是 error。当然 errnoEINPROGRESS 因为它的值自从调用 connect() 后没有改变。

问题已回答。谢谢大家。

I am using the the the same piece of code as in Stevens' UNIX Network Programming non >blocking connect() example:

  1. Setting socket to nonblocking
  2. Initiate nonblocking connect()
  3. Check for immediate completion
  4. Call select() with timeout and wait for read or write readiness
  5. When select() returns with value greater than 0 do getsockopt(socket, SOL_SOCKET, SO_ERROR, &error, &len).

The error I am getting is EINPROGRESS. The code is executed on rhel5 server.

Any ideas why I am getting this error?

代码片段:

 flags = fcntl(sockfd, F_GETFL, 0);
fcntl(sockfd, F_SETFL, flags | O_NONBLOCK);

if ((retVal = connect(sockfd, saptr, salen)) < 0)
if (errno != EINPROGRESS)
return (-1);

if (retVal == 0)
{
// restore file status flags
fcntl(sockfd, F_SETFL, flags);
return 0;
}

FD_ZERO(&rset);
FD_SET(sockfd, &rset);
wset = rset;
tval.tv_sec = nsec;
tval.tv_usec = 0;

if ((retVal = select(sockfd + 1, &rset, &wset, NULL, &tval)) == 0)
{
// timeout
close(sockfd);
errno = ETIMEDOUT;
return (-1);
}

if (retVal < 0)
{
// select() failed
return (-1);
}

if (FD_ISSET(sockfd, &rset) || FD_ISSET(sockfd, &wset))
{
len = sizeof(error);
error = 0;
if (getsockopt(sockfd, SOL_SOCKET, SO_ERROR, &error, &len) < 0)
return (-1);

if (error > 0) //<<<<< error == EINPROGRESS >>>
{
close(sockfd);
errno = error;
return (-1);
}
}
else
{
return (-1);
}

// restore file status flags
fcntl(sockfd, F_SETFL, flags);

最佳答案

糟糕....我放弃了。我试了又试,但找不到您的代码有问题。所以,我提供的只是一些建议和假设。

  • 使用 FD_COPY 将 rset 复制到 wset。

  • 当第一次连接失败时,你能做一个 getsockopt 吗?我怀疑 Select 正在返回 0 并且由于上述原因,不知何故设置了 writefd 并且执行 getsockopt 会返回上一个连接的陈旧错误。 IMO,后续连接应该返回 EALREADY(尽管它可能依赖于平台)

请执行以上操作(如果我使用 FD_COPY 有误,请给我投反对票)并分享结果

关于c++ - getsockopt() 在非阻塞 connect()+select() 流程中返回 EINPROGRESS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1097771/

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