iocp错误,有时无法接收消息
iocp error, cannot receive message sometimes
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((真是个坏主意。。。
- boost::进程间消息队列引发错误
- C++错误消息*成员参考.**初学者*
- 如何通过参数抛出错误消息
- glad 导致 glfwSwapBuffers 返回错误消息
- FindPackageHandleStandardArgs.cmake:137 的 CMake 错误(消息):找不到 Boost (缺少:正则表达式)(找到合适的版本"1.72.0",
- 如何接受 [ENTER] 键作为无效输入并发送错误消息
- 重新定义预定义的 errno 错误消息 (E2BIG)
- SDL 映像:无法打开映像,仅显示错误消息
- 错误消息:使用"string* +="后"no match for 'operator+='"
- 使用公钥加密消息:BER 解码错误
- 我在主函数的左括号上不断收到错误,消息为obj\Debug\main.o||在函数"ZN11linked_listC1Ev"中:|
- 错误消息"expected expression"....有人知道它为什么这么说吗?
- 在 Eclipse: "error: no match for 'operator='" 中获取错误消息
- 出现分段错误时,更改显示的消息错误
- 使用C 中的OPENSL RSA函数解密消息错误
- Linux汇编程序消息错误c++
- C++写入消息错误
- 发送http post消息错误报告的安全方式
- C++,在尝试创建类时收到此消息:错误:没有在类“media”中声明的“void media::*()”成员函数
- 编译器错误消息错误:令牌之前的预期')' '*'。我的构造函数出错