我的GetQueuedCompletionStatus脱靶了,咋办?(增强服务器的健壮性)

时间:2021-04-15 17:38:46
我的服务是一个UDP的完成端口模型,有两个工作线程,每接到完成通知就先投递一个WSARecvfrom,一般情况下很正常的工作,但是,有一种情况可以使之脱靶,GetQueuedCompletionStatus返回了ERROR_SUCCESS,
并且*lpOverlapped非空, lpNumberOfBytes 等于零,说明完成端口与套接字的关联已经被关闭。
出现情况是,服务操作了远程数据库,客户又是在线程里不停的发送和接收,客户没有正常关闭线程,而是直接关闭了对话框,照此操作就会让服务器洗白,我现在不知道怎样能避免这种极端客户的操作,有好意见的朋友不防说来听听。

7 个解决方案

#1


脱靶? 

不懂  帮你顶

#2


就是套接字与完成端口的关联无效了,如何重新关联?再使用CreateIoCompletionPort((HANDLE) mConSock, CompletionPort, (DWORD) PerHandleKey,0);失败了。

#3


我使用过那么长时间,重没发现这个问题,IOCP肯定是没有问题的,最好仔细检查一下你的代码

#4


关注

#5


是有这种情况的。
其实对于这种情况来说,检查到"脱靶"的UDP这端是没有问题的,楼主重新投递一次就可以了。
但是楼主的问题应该在于当检查到这种情况时,就把这个UPD套接字关闭了是吧???
所以楼主在建立与这个socket句柄相关联的时候保存其UDP句柄的类型,当出现这种情况的时候,先判断是否为UDP类型的句柄,如果是,则重新投递就可以了。因为按正常下UDP是不会出现这种情况的。
你重新投递一下就可以重新有效了。

#6


谢谢楼上,我曾经这么做了,还是有问题,不过今天看了你的回复,重试了一遍,既然成功了。

你能不能解释一下为什么会发生这样的情况?

#7


做过udp+iocp,但没见到这种现象。帮你up,顺便学习。

#1


脱靶? 

不懂  帮你顶

#2


就是套接字与完成端口的关联无效了,如何重新关联?再使用CreateIoCompletionPort((HANDLE) mConSock, CompletionPort, (DWORD) PerHandleKey,0);失败了。

#3


我使用过那么长时间,重没发现这个问题,IOCP肯定是没有问题的,最好仔细检查一下你的代码

#4


关注

#5


是有这种情况的。
其实对于这种情况来说,检查到"脱靶"的UDP这端是没有问题的,楼主重新投递一次就可以了。
但是楼主的问题应该在于当检查到这种情况时,就把这个UPD套接字关闭了是吧???
所以楼主在建立与这个socket句柄相关联的时候保存其UDP句柄的类型,当出现这种情况的时候,先判断是否为UDP类型的句柄,如果是,则重新投递就可以了。因为按正常下UDP是不会出现这种情况的。
你重新投递一下就可以重新有效了。

#6


谢谢楼上,我曾经这么做了,还是有问题,不过今天看了你的回复,重试了一遍,既然成功了。

你能不能解释一下为什么会发生这样的情况?

#7


做过udp+iocp,但没见到这种现象。帮你up,顺便学习。