对于同一个socket,WSASend和WSARecv都是填写Overlapped,
而我在GetQueuedCompletionStatus之后无法确定是WSASend还是WSARecv完成了,
通过什么方式我能分辨出是刚才的WSASend完成还是WSARecv完成呢?

解决方案 »

  1.   

    也就是说
    1.我先WSARecv在等待数据的到来
    2.正在等待的时候因为一些原因我WSASend给这个sock一些数据,
    3.此时我调用GetQueuedCompletionStatus得到的完成端口是我以前WSARecv等待的呢,还是我刚WSASend的完成呢?
      

  2.   

    呵呵,我做的发送,直接用send,这样就不会产生你那种问题了
      

  3.   

    对于多CPU,多线程的情况下,
    如果一个socket已经WSARecv正在等待GetQueuedCompletionStatus时,
    如果此时其他线程往此socket WSASend
    对于完成端口来说,就同时有两个事件在等待.
    如果此时正好也recv来了数据,
    两个线程可能会同时运行,
    怎么区别哪个是Send,哪个是Recv呢?如果是收完了再发,肯定不会出这种情况,因为那样有种单工的感觉.如果用send,也就是不用overlap,如果是非lock模式,
    怎么知道发送是否成共了呢?如果send 是lock模式,recv是非lock模式,
    不太可能吧.
      

  4.   

    如果用send,也就是不用overlap,如果是非lock模式,
    怎么知道发送是否成共了呢?如果send 是lock模式,recv是非lock模式,
    不太可能吧.我做的冬冬完成端口主要是为了应用WSARecv。
    直接send(socket...),阻塞,怎么会是不可能!
      

  5.   

    我曾经测试过,socket在设置为非阻塞模式后,无法再次设置为阻塞模式,所以send和recv一个阻塞另一个非阻塞没有实用价值。WSARecv不一定非要用在完成端口上啊