前几天遇到了传说中的R6025错误,经过网络上搜索一番知道这是由于运行时调用了鸡肋的纯虚函数,一般出现在构造函数和析构函数中间接的调用了纯虚函数。但问题是,这不是我的情况。因此,我进行了两天的代码调试,总算是发现了元凶。
问题出在完成端口!在我的完成端口模型中,完成键是一个对象,它随一个SOCKET句柄关联到完成端口。当一个完成包被成功获取,则使用这个完成键(对象)执行完成任务。这没错,并且我把对象使用引用计数来管理生命周期,一切尚在预期之中。但问题出在,我需要更换这个SOCKET句柄的完成键。当这个SOCKET需要收发数据,则被封装在一个叫NetSession的类中,完成键就是...
在一个线程A中检测AcceptEx的存量,如果小于某个数值则投递一定数量的AcceptEx到完成端口。这个线程非常简单,但是在程序退出时必须清理掉投递到完成端口中的那些AcceptEx,以达到释放资源。因此,在程序退出前我必须发出信号给线程A,告诉它要终止运行。然,线程A是终止运行了,但存在完成端口中的AcceptEx还没清理,我尝试了一下几种清理方式:
第一天、直接closesocket(listensocket)关闭这个关联到完成端口的监听SOCKET。
这种方式,失败了!完成端口鸟都没鸟这已经关闭的listensocket,没有发生出队一个失败的完成包。
第二天、先调...