Ошибка IOCP, иногда не может получить сообщение - PullRequest
0 голосов
/ 13 сентября 2011

Код 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, тип = 2, sockfd = 4294967295

2011-09-13 04:48:41 GetQueuedCompletionStatus 返回 false, errno = 64, addr = 227492836, тип = 2, sockfd = 4294967295

... еще много таких же ...

2011-09-13 04:48:41 GetQueuedCompletionStatus 返回 false, errno = 64, addr = 227492836, type = 2, sockfd = 4294967295

вышеэто только часть файла журнала, как вы видите, журнал ошибок напечатан так много, номер ошибки 64, а дескриптор сокета 4294967295 (0xffffffff), когда журнал ошибок печатается, сервер не может отправить сообщение, не могу получить сообщение.Я хочу знать, как решить эту проблему, благодаря вам!

1 Ответ

0 голосов
/ 13 сентября 2011

Шаг первый, выясните, что говорит вам ошибка = 64. Для этого откройте WinError.h и выполните поиск 64 ...

Результат - ERROR_NETNAME_DELETED - поэтому, скорее всего, ваше соединение разорвано ...

Я не уверен, почему вы получаете так много из них, у вас есть большое количество ожидающих операций на каждом сокете?

Sleep () - очень плохая идея ...

...