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 に答える