有关完成端口客户端断开引发的问题(100分)

  • 主题发起人 主题发起人 zyme007
  • 开始时间 开始时间
Z

zyme007

Unregistered / Unconfirmed
GUEST, unregistred user!
我的完成端口设计模式如下:
开两个WorkerThread,收到数据后保存到内存池中,另有一个线程池对收到的数据进行重新组包并分析,然后由调用WSASend把结果送给客户端。

今天发现一个问题:连接一个客户端,数据收发N次后,把客户端断开,服务端跟踪到BytesTransferred = 0的事件竟然发生了N次!!如果服务端只发送不接收,N次后,BytesTransferred = 0的事件也还是发生了N次,如果把线程池中的WSASend代码屏蔽,只接收不发送,就不会出现这种情况。。。。那位兄弟知道是什么原因引起的???
 
江湖规矩,自己先顶
 
没人遇到过这种问题吗?
 
内存池怎么做啊
 
找到原因了,是这样的
线程池中调用WSASend后,工作者线程GetQueuedCompletionStatus发现有数据发送,发送后我针对该PerIoData又做了次WSARCV,问题就出在这里,这里的PerIoData是线程中创建的,调用了WSARCV就把这个新的Overlpad关联到了IO端口上,所以终端断开时,就触发了该Socket上的所有Overlpad。

害我一个晚上没睡好。。。早上上班突然发现。换换脑子常会有种柳暗花明的感觉。
散分
 
多人接受答案了。
 
后退
顶部