send一次只能发送一个缓冲,可以在循环里判断是否发送完毕。 而WSASend 可以一次发送多个缓冲,怎么判断是否发送完毕? 内有代码示例

wd_6532 2006-02-15 09:46:34
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];
}

是这样吗????
...全文
223 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
striking 2006-02-16
  • 打赏
  • 举报
回复
re:如果每个缓冲都发送了一半,第4个参数会不会返回一个元素大小都是二分之一的数组?
发送如果没有完成, 第4个参数不能判断发送的字节数

简单的讲,如果WSASend 返回0 ,就是发送成功, 第4个参数就是发送的字节数.

不然, 就是还没有成功, 系统还在发送, 那你就等待事件通知吧
wd_6532 2006-02-15
  • 打赏
  • 举报
回复
如果每个缓冲都发送了一半,第4个参数会不会返回一个元素大小都是二分之一的数组?

再确定一遍,这儿是不是跟异步的send不一样。
异步send是需要检测是否完全发送完毕了。

WSASend是不是不需要检测是不是发了一部分,只需要调用一次WSASend,就可以放弃这几个缓冲的数据了?
striking 2006-02-15
  • 打赏
  • 举报
回复
判断WSASend 的返回值来确定是否发送完毕. 如果返回0 ,表示发送成功. 否则,需要通过
WSAGetLastError() 来判断是否系统正在发送, 或者发送失败了.

如果 WSAGetLastError() == WSA_IO_PENDING 的话, 表示正在发送当中. 就需要上面说的那样等待事件通知


发送成功的话, 第4个参数表示发送的字节数
wd_6532 2006-02-15
  • 打赏
  • 举报
回复
以前看过重叠IO和完成端口不过忘了。

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

那这第4个参数有什么作用?
striking 2006-02-15
  • 打赏
  • 举报
回复
不是的.

通常发出象WSASend这样的重叠io调用, 函数立即返回.

你需要通过WSAWaitForMultipleEvents(), 来判断一个重叠io什么时候完成, 就像WSASend

通过WSAGetOverlappedResult() 来判断重叠调用成功或者失败.

你还是多看看重叠方面的资料

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧