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),当打印错误日志时,服务器无法发送消息,无法接收消息。我想知道如何解决这个问题,谢谢你!
答案 0 :(得分:0)
第一步,找出错误= 64告诉你的错误。为此,打开WinError.h并搜索64 ...
结果是ERROR_NETNAME_DELETED - 因此,您的连接可能已经消失......
我不确定为什么你会得到这么多,你是否在每个套接字上都有大量的待处理操作?
睡眠()是一个非常糟糕的主意......