传递给WSARecv()一个重叠的socket,然后调用WSAWaitForMultipleEvents(infinite)进行等待,如果一直没有数据传入的话,经过一段时间后,WSARecv()还是会把传递给他的overlapped.hEvent设为有信号的。我的问题就是如何设置经过的这段时间的长度?或者说是有没有办法把一个在后台执行的重叠操作取消掉?看了MSDN,上面说WSARecv在wsabuf填满或socket被关掉或内部缓冲区没有数据时才会返回,而且对于非锁定的socket,设置SO_RCVTIMEO是没有效果的。

解决方案 »

  1.   

    是这样的,我最近在写一个smtp客户端。但有时服务器返回的信息可能不会被WSARecv()一次读回,这样就造成岔位(比如,发出一条命令后得到的响应实际上是上条命令的响应,因为上条命令有多条响应,而前面只读回了一条)所以我想设置一个较短的时间(帖子中指的 WSARecv()的等待时间),这样每发完一条指令后可以进行多个WSARecv()读取,以免返回的多条响应没有读到。不知这样做是不是有点太笨?或者有什么好的办法?
      

  2.   

    SMTP服务器给你发返回消息的时候,会有\r\n的结束符号,你判断这个结束符号就可以了
      

  3.   

    服务器不会针对你的一条命令返回两个信息,而这两个信息都是以\r\n结尾的?
    如果是这样的话那目前问题是解决了。但我仍想知道有没有方法可以控制WSARecv()针对无数据流入的等待时间?在重叠模式下
      

  4.   

    不对,我刚看了
    比如你发EHLO时,服务器会返回它所支持的ESMTP扩展字,每个扩展字都是以\r\n分隔的。