char p[2048];
nLeft=2048;while(nLeft>0)
{
   ret=send(sock,p,nLeft);
   .....
   nLeft-=ret;
}但是WSASend呢? 怎么做。
难道也是照猫画虎?char p1[2];
char p2[64];
char p3[2];
int  iLefts[3];
int  iSends[3];
sends[0]=2;sends[0]=64;sends[3]=2;
while (iLeft[0]>0 || iLeft[1]>0 || iLeft[2]>0)
{
   WSASend(sock,wsabuffer,3,iSends...);
   iLeft[0]-=iSends[0];
   iLeft[1]-=iSends[1];
   iLeft[2]-=iSends[2];
}是这样吗????

解决方案 »

  1.   

    不是的.通常发出象WSASend这样的重叠io调用, 函数立即返回. 你需要通过WSAWaitForMultipleEvents(), 来判断一个重叠io什么时候完成, 就像WSASend通过WSAGetOverlappedResult() 来判断重叠调用成功或者失败. 你还是多看看重叠方面的资料
      

  2.   

    以前看过重叠IO和完成端口不过忘了。是不是 WSASend之后,系统会自动保证投递的几个缓冲一定会被发送完毕,
    不用人工检测是否WSASend的第4个参数中回写的发送的字节数?
    只有等待WSAWaitForMultipleEvents或者完成端口的返回事件就可以了?那这第4个参数有什么作用?
      

  3.   

    判断WSASend 的返回值来确定是否发送完毕. 如果返回0 ,表示发送成功. 否则,需要通过
    WSAGetLastError() 来判断是否系统正在发送, 或者发送失败了.如果 WSAGetLastError() == WSA_IO_PENDING 的话, 表示正在发送当中. 就需要上面说的那样等待事件通知
    发送成功的话, 第4个参数表示发送的字节数
      

  4.   

    如果每个缓冲都发送了一半,第4个参数会不会返回一个元素大小都是二分之一的数组?再确定一遍,这儿是不是跟异步的send不一样。
    异步send是需要检测是否完全发送完毕了。WSASend是不是不需要检测是不是发了一部分,只需要调用一次WSASend,就可以放弃这几个缓冲的数据了?
      

  5.   

    re:如果每个缓冲都发送了一半,第4个参数会不会返回一个元素大小都是二分之一的数组?
    发送如果没有完成, 第4个参数不能判断发送的字节数简单的讲,如果WSASend 返回0 ,就是发送成功, 第4个参数就是发送的字节数.不然, 就是还没有成功, 系统还在发送, 那你就等待事件通知吧