0

iocpコードは以下のとおりです。

void xIocpWorkThread::Execute(LPVOID lpParam)
{
    DWORD   dwNumberOfBytes = 0;
    ULONG_PTR   ulCompletionKey = 0;
    IOCP_UNIT   * pIocpunit = 0;
    DWORD last_err = 0;
    DWORD listener_addr = 0;
    DWORD listener_sock = 0;

    while( !xThread::IsTerminated() )
    {
        if( GetQueuedCompletionStatus(m_hIocp, &dwNumberOfBytes, &ulCompletionKey, (LPOVERLAPPED*)&pIocpunit, INFINITE ) )
        {
            pIocpunit->pUnit->OnComplete( dwNumberOfBytes, (DWORD)ulCompletionKey );

        }
        else
        {
            if( pIocpunit != NULL )
            {
                last_err = GetLastError();
                xEventListener *pListener = pIocpunit->pUnit->getEventListener();
                DWORD _puint_type = pIocpunit->pUnit->getType();
                pIocpunit->pUnit->OnComplete( 0, 0 );               

                if(pListener != 0)
                {
                    listener_addr = (DWORD)((void*)(pListener));
                    listener_sock = pListener->get_sock_fd();
                }           

                LOG("GetQueuedCompletionStatus返回false, errno = %u, addr = %u, type = %u, sockfd = %u", last_err, listener_addr, _puint_type, listener_sock);
            }
            else
            {               
                last_err = GetLastError();
                LOG("GetQueuedCompletionStatus返回false, pIocpunit = null, errno = %u", last_err);
                Sleep( 10 );
            }           
        }
    }
}

上記の関数は、ロジックスレッドとは異なるスレッドで実行されています。通常はエラーログは出力されませんが、ゲームサーバーが稼働しているとクライアントメッセージを受信できず、クライアントにもメッセージを送信できませんが、しばらくするとサーバーは自動的に正常になり、メッセージを受信し、メッセージを送信できます。しばらくすると、サーバーはメッセージを送信および受信できなくなります。これは定期的に発生します。エラーログは次のとおりです。

2011-09-13 04:48:41 GetQueuedCompletionStatusバック回false、errno = 64、addr = 227492836、type = 2、sockfd = 4294967295

2011-09-13 04:48:41 GetQueuedCompletionStatusバック回false、errno = 64、addr = 227492836、type = 2、sockfd = 4294967295

2011-09-13 04:48:41 GetQueuedCompletionStatusバック回false、errno = 64、addr = 227492836、type = 2、sockfd = 4294967295

...同じものがもっと...

2011-09-13 04:48:41 GetQueuedCompletionStatusバック回false、errno = 64、addr = 227492836、type = 2、sockfd = 4294967295

上記はログファイルの一部にすぎません。ご覧のとおり、エラーログが大量に印刷され、エラー番号は64、ソケット記述子は4294967295(0xffffffff)です。エラーログを印刷すると、サーバーはできません。メッセージを送信し、メッセージを受信できません。この問題を解決する方法を知りたいのですが、ありがとうございます。

4

1 に答える 1

0

ステップ 1 では、エラー = 64 が何を示しているかを調べます。これを行うには、WinError.h を開いて 64 を検索します ...

結果は ERROR_NETNAME_DELETED です。接続が切断された可能性があります...

なぜこれほど多くのメッセージが表示されるのかわかりませんが、各ソケットに多数の保留中の操作がありますか?

Sleep() は本当に悪い考えです...

于 2011-09-13T12:24:05.220 に答える