ConnectEx返回false,WSAGetLastError返回0

时间:2013-12-26 20:57:06

标签: runtime-error connect winsock iunknown

此代码段是函数的一部分,当套接字连接(或连接)时应返回true,否则返回false。

    if(bind(socket_, reinterpret_cast<sockaddr*>(&any), sizeof any) < 0)
    {
        DWORD err = GetLastError();
        logger() << "bind: " << ErrorMessage(err) << std::endl;
        return false;
    }

    rc = ConnectEx(socket_,
        reinterpret_cast<sockaddr*>(&addr_),
        sizeof addr_,
        NULL, 0, NULL,
        &connectOv_.ov);
    if(rc)
    {
        setsockopt(socket_, SOL_SOCKET, SO_UPDATE_CONNECT_CONTEXT, NULL, 0);
        return true;
    }
    DWORD err = GetLastError();
    if(err == WSA_IO_PENDING)
    {
        return true;
    } 
    logger() << "connect: " << ErrorMessage(rc) << std::endl;
    return false;

我无法理解为什么rc和err总是为零,无论块的实际结果如何。如果参数是正确的(上面的序列),尽管故障发生了故障,该块仍可正常工作(我看到套接字与netstat连接)。但是如果我调整参数,通过将重叠值更改为NULL或将套接字更改为-1,函数将返回相同的值。

1 个答案:

答案 0 :(得分:0)

错过了问题描述中的一些上下文。套接字绑定到I / O完成端口。函数调用失败,但ConnectEx的结果是通过工作线程中的GetQueuedCompletionStatus接收的。

编辑: 我本应该打电话给WSAGetLastError()