我的完成端口设计模式如下:
  开两个WorkerThread,收到数据后保存到内存池中,另有一个线程池对收到的数据进行重新组包并分析,然后由调用WSASend把结果送给客户端。今天发现一个问题:连接一个客户端,数据收发N次后,把客户端断开,服务端跟踪到BytesTransferred = 0的事件竟然发生了N次!!如果服务端只发送不接收,N次后,BytesTransferred = 0的事件也还是发生了N次,如果把线程池中的WSASend代码屏蔽,只接收不发送,就不会出现这种情况。那位兄弟知道是什么原因引起的???

解决方案 »

  1.   

    收发不会用的同一个socket吧?
      

  2.   

    BytesTransferred = 0 应该是你期待接受该套接字上的数据所引起的吧(例如你的接收线程接收到数据后添加到处理队列然后又调用了接收,之后你断开连接这些接收自然要返回了),实在不行把代码贴出来看看。
      

  3.   

    找到原因了,是这样的
    线程池中调用WSASend后,工作者线程GetQueuedCompletionStatus发现有数据发送,发送后我针对该PerIoData又做了次WSARCV,问题就出在这里,这里的PerIoData是线程中创建的,调用了WSARCV就把这个新的Overlpad关联到了IO端口上,所以终端断开时,就触发了该Socket上的所有Overlpad。害我一个晚上没睡好早上上班突然发现。换换脑子常会有种柳暗花明的感觉。
    散分
      

  4.   

    ProgrameMan(程序人生)说的是不是也是这个意思?
      

  5.   

    对,开始我说得就是这个意思,但后来我重新看了一下你的问题,你说“如果把线程池中的WSASend代码屏蔽,只接收不发送,就不会出现这种情况。”所以我以为说得不对呢,谁知道你“发送后我针对该PerIoData又做了次WSARCV”呵呵!
    解决就好