1

ソケットのイベント通知に WSAEventSelect を使用しています。これまでのところ、すべてがクールで魅力的に機能していますが、問題が 1 つあります。

クライアントは .NET アプリケーションで、サーバーは Winsock C++ で記述されています。.NET アプリケーションでは、TCP/IP に System.Net.Sockets.Socket クラスを使用しています。Socket.Shutdown() および Socket.Close() メソッドを呼び出すと、サーバーで FD_CLOSE イベントを受け取りますが、これは問題ないと確信しています。WSAEnumNetworkEvents に渡した WSANETWORKEVENTS の iErrorCode をチェックすると問題が発生します。こんな感じでチェックします

if (listenerNetworkEvents.lNetworkEvents & FD_CLOSE)
    {
        if (listenerNetworkEvents.iErrorCode[FD_CLOSE_BIT] != 0)
        {
            // it comes here
            // which means there is an error
            // and the ERROR I got is
            // WSAECONNABORTED
            printf("FD_CLOSE failed with error %d\n", 
                listenerNetworkEvents.iErrorCode[FD_CLOSE_BIT]);
            break;
        }

        closesocket(socketArray[Index]);
}

しかし、WSAECONNABORTEDエラーで失敗します。どうしてこんなことに?

編集:ところで、私はクライアントとサーバーの両方を同じコンピューターで実行していますが、それが原因ですか? そして、これを行うと FD_CLOSE イベントを受け取りました:

server.Shutdown(SocketShutdown.Both);   // in .NET C#, client code
4

1 に答える 1