2

这个片段是一个函数的一部分,当套接字连接(或连接)时应该返回 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,函数返回相同的值。

4

1 回答 1

0

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

编辑:我应该打电话WSAGetLastError()来代替。

于 2013-12-30T15:21:32.970 回答