请教IOCP的DisconnectEx投递后完成事件达到顺序问题。
为了在IOCP中使SOCKET句柄复用,我使用了DisconnectExt函数,一般情况下客户端与服务端建立连接后,服务端会投递一个WSARecv例程给IOCP以接收来自客户端的数据,而服务端主动断开连接时会投DisconnectEx例程。
问题描述:
当服务端主动提交DisconnectEx例程后正常情况是先收到WSARecv完成事件 然后收到DisconnectEx完成事件并且在DisconnectEx事件中做一些资源清理工作然后把此句柄提交给AcceptEx队列中。但问题是有时候先接收到的是DisconnectEx完成事件然后再接收到是WSARecv完成事件,这种情况造成一些问题比如当清理工作完成后IOCP会把这个SOCKET分配给一个新的连接,这个时候可能收到的WSARecv完成事件是原来旧的连接上的。
我在DisconnectEx之前也用过了CancelEx来取消IO但无济于世,问教大家有什么办法能在接收到断开事件前让WSARecv完成事件先达到,这样才能顺序条理的释放句柄上的资源。