Код 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), когда журнал ошибок печатается, сервер не может отправить сообщение, не могу получить сообщение.Я хочу знать, как решить эту проблему, благодаря вам!