0

代码新宠物:

int CreateaTCPSocket()
{
    int iSockID =  ACE_OS::socket(......);
    ACE_OS::set_flags(iSockID,O_NONBLOCK);
    ACE_OS::bind();
    if (ACE_OS::connect(iSockID ,....) < 0)
    {
        if (ACE_OS::select(.....,timeout) <= 0)
        {
            return INVALID_HANDLE;
        }
    }
    return iSockID;
}

我的问题是当连接因非阻塞错误而失败并调用 select 并说 select return success 然后我们需要再次调用 connect 或 select function internal do connect?

4

2 回答 2

3

对于阻塞和非阻塞套接字,您只需要调用connect()一次。

当套接字是非阻塞并connect()返回EINPROGRESS时,它需要等到套接字准备好使用select(). 当select()报告套接字已准备好写入时,它可能是connect()成功的,也可能是失败的。

要检查非阻塞是否connect()成功,您可以调用getsockopt(..., SOL_SOCKET, SO_ERROR, ...)在失败时报告非零错误,或者调用getpeername()仅在连接的套接字上成功的调用。

于 2011-01-17T11:56:29.887 回答
0

为什么连接失败后调用选择?你想达到什么目的?select 通知调用者有关作为参数给出的资源的任何活动。这些活动可以

  • 一个错误(例如:tcp socket: peer disconnected)
  • 可用数据(可以在没有实际阻塞的情况下执行阻塞读取)
  • 可以写入(在最后一次写入失败且缓冲区已满后)

我猜在您描述的场景中, select 将始终返回 EBADF (在我知道的某些操作系统中),因为描述符尚未打开或已关闭。

hth

马里奥

于 2011-01-17T11:57:36.150 回答