select function internaly是否调用tcp connect?

时间:2011-01-17 11:44:13

标签: c++ c sockets ace select-function

Code Sinnpet:

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

我的问题是当连接失败时出现非阻塞错误并选择被调用并说选择返回成功然后我们需要再次调用connect或select函数内部做连接吗?

2 个答案:

答案 0 :(得分:3)

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

当套接字是非阻塞的并且connect()返回EINPROGRESS时,它需要等待套接字准备好使用select()进行写入。当select()报告套接字已准备好写入时,它可以是connect()成功或失败。

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

答案 1 :(得分:0)

为什么一旦连接失败就调用select?你想用它做什么? select将作为参数给出的资源上的任何活动通知给调用者。这些活动可能是

  • 错误(例如:tcp socket:peer 断开)
  • 可用数据(无需实际执行阻止读取 阻塞)
  • 写入可能(上次写入失败,缓冲区已满)

我想在你描述的场景中,select会一直返回EBADF(在我知道的一些操作系统中),因为描述符尚未打开或已经关闭。

HTH

马里奥