ConnectEx возвращает false, а WSAGetLastError возвращает 0

этот фрагмент является частью функции, которая должна возвращать 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, функции вернут те же значения.


person user666412    schedule 26.12.2013    source источник
comment
Функция не возвращает ни err, ни rc.   -  person Martin James    schedule 30.12.2013
comment
@MartinJames, что ты имеешь в виду? getLasterror возвращает ошибку. На моем сервере у меня жестко закодирован ip: 192.168.0.2, а на моем клиенте у меня жестко закодирован тот же ip. знаете в чем может быть причина?   -  person user786    schedule 01.10.2016


Ответы (1)


Пропущен некоторый контекст в описании проблемы. Сокет был привязан к порту завершения ввода-вывода. Вызов функции завершился неудачно, но результат ConnectEx был получен через GetQueuedCompletionStatus в рабочем потоке.

РЕДАКТИРОВАТЬ: вместо этого я должен был позвонить WSAGetLastError().

person user666412    schedule 30.12.2013
comment
что именно вы имеете в виду? getLasterror возвращает ошибку. На моем сервере у меня жестко закодирован ip: 192.168.0.2, а на моем клиенте у меня жестко закодирован тот же ip. знаете в чем может быть причина? - person user786; 01.10.2016
comment
После свежего обзора я должен был вызвать WSAGetLadtError - person user666412; 02.10.2016