EayIocp有更改会在这里列出日志,建议大家去这里下载最新代码。
1)2014年7月4日 - 意外关闭监听套接字的bug
CSDN网友kkia进行了如下操作:“试了下 ,服务端正常开启,客户端把sendMessage发送数据注释掉,然后编译运行,此时客户端程序停留在recv函数处,到现在一切正常,但是点击客户端窗口的关闭后,服务端的线程全部退出了。。。也就是崩溃了,我刚接触到这个,也不知道什么原因。”。
我自己尝试了一下EasyIocp输出如下图。WSAGetLastError给出错误消息如下:
错误原因是关闭客户端时,EasyIocpError::DealCompletionError函数处理错误ERROR_NETNAME_DELETED(ErrorCode = 64),此时调用EasyClients::RemoveClient函数时关闭了套接字,而此套接字是监听套接字,然后造成了(ErrorCode=995)的错误消息。此bug在于EasyClients::RemoveClient实现有问题,不应该一开始就调用closesocket,而是应该查找是否有此客户端若有才进行清理操作。
函数EasyClients::DealCompletionError未区分出现错误的套接字是监听套接字,还是数据传输套接字,而是简单的对他们进行统一处理。若需要更详细的处理错误,可以在此函数中调用CompletionKey::GetKeyType获得套接字类型,根据监听套接字或是数据传输套接字进行错误处理。