iocp错误,有时无法接收消息

iocp error, cannot receive message sometimes

本文关键字:消息 错误 iocp      更新时间:2023-10-16

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 GetQueuedCompleteStatus返回false,errno=64,addr=2227492836,type=2,sockdd=4294967295

2011-09-13 04:48:41 GetQueuedCompleteStatus返回false,errno=64,addr=2227492836,type=2,sockdd=4294967295

2011-09-13 04:48:41 GetQueuedCompleteStatus返回false,errno=64,addr=2227492836,type=2,sockdd=4294967295

。。。更多相同的

2011-09-13 04:48:41 GetQueuedCompleteStatus返回false,errno=64,addr=2227492836,type=2,sockdd=4294967295

以上只是日志文件的一部分,正如您所看到的,错误日志打印得太多了,错误编号为64,套接字描述符为4294967295(0xffffffff(,当打印错误日志时,服务器无法发送消息,无法接收消息。我想知道如何解决这个问题,谢谢你

第一步,找出error=64告诉您的内容。要做到这一点,打开WinError.h并搜索64。。。

结果是ERROR_NETNAME_DELETED-因此,很可能您的连接已断开。。。

我不知道为什么你会得到这么多这样的东西,你在每个套接字上都有大量的挂起的操作吗?

Sleep((真是个坏主意。。。