..........前面的过程略 WSABUF DataBuf;
WSAEVENT hEvents[2];
WSAOVERLAPPED RecvOverLapp;
DWORD flag;
hEvents[0]=hExitEvent;
hEvents[1]=hRecvEvent;
DataBuf.buf=data;
DataBuf.len=len;
memset(&RecvOverLapp,0,sizeof(WSAOVERLAPPED));
RecvOverLapp.hEvent=hRecvEvent;
flag=0;
/////////////////////////////////////
int ret;
if((ret=WSARecv(socket,&DataBuf,1,retlen,&flag,&RecvOverLapp,NULL))==0)
return true;
else if((ret==SOCKET_ERROR)&&(WSAGetLastError()==WSA_IO_PENDING))
{
DWORD EventCaused=WSAWaitForMultipleEvents(2,hEvents,FALSE,time,FALSE);
...后面的过程略
}上面是接收函数的大体的实现,我想问WSAWaitForMultipleEvents这个函数什么时候超时?我知道如果在time这断时间内,WSARecv()没有收到数据肯定会返回。但现在我要问的问题是WSARecv()这个函数中DataBuf成员里指定了缓冲区的长度。如果接收的时候实际接受的数据的长度小于指定的len,那么WSAWaitForMultipleEvents()会返回吗?还是直到收到len的长度才返回呢?谢谢

解决方案 »

  1.   

    如果接收的时候实际接受的数据的长度小于指定的len,那么WSAWaitForMultipleEvents()会返回吗?///////////////////////////////////////////////会,
      

  2.   

    那是不是只要WSARecv()收到数据,哪怕是一个字节(远远小于指定的len),WSAWaitForMultipleEvents()都会返回呢?
      

  3.   

    from msdn:
    WSAWaitForMultipleEventsIf dwTimeout is zero, the function tests the state of the specified event objects and returns immediately. If dwTimeout is WSA_INFINITE, the function's time-out interval never expires.
      

  4.   

    taianmonkey() ( ) 你说的,不是我问的。我是说,在time的时间内,如果WSARecv()收到了数据,但是小于指定的len,WSAWaitForMultipleEvents()函数是否会返回?
      

  5.   

    那是不是只要WSARecv()收到数据,哪怕是一个字节(远远小于指定的len),WSAWaitForMultipleEvents()都会返回呢?
    ///////////////////////////////////////////////////////不是这样的,底层有它自己的机制,这个机制正如鼠标驱动程序如何判断是双击一样。它会设定一个时间,如果在指定的时间内没有数据到达,它会认为这次的i/o操作完成,通知上层返回
      

  6.   

    nuaawenlin(飘人) 
    你说的也不是我问的。
    你说,“不是这样的,底层有它自己的机制,这个机制正如鼠标驱动程序如何判断是双击一样。它会设定一个时间,如果在指定的时间内没有数据到达,它会认为这次的i/o操作完成,通知上层返回
    ”什么叫在指定的时间内没有数据到达????我现在问的是,如果在指定的时间内有数据到达,但是这个数据的长度不是len(DataBuf.len),即,如果到达的数据不是指定的长度。
    这种情况下会返回吗?
      

  7.   

    WSAWaitForMultipleEvents
    The WSAWaitForMultipleEvents function returns either when one or all of the specified event objects are in the signaled state, or when the time-out interval expires.DWORD WSAWaitForMultipleEvents(
      DWORD cEvents,
      const WSAEVENT* lphEvents,
      BOOL fWaitAll,
      DWORD dwTimeout,
      BOOL fAlertable
    );
      

  8.   

    msdn上的我知道啊。可是事件什么时候是处于传信状态呢?收到len的时候,还是只要有数据传过来(不管它的长度是不是len)就处于传信状态呢?
      

  9.   

    会系统并不保证你的WSARECV调用返回的就是你要的LEN。