请教个wsasend的问题

yhlovehx 2009-11-17 05:43:13
Wsasend 投递成功后
GetQueuedCompletionStatus返回的实际传送字节数
可能小于 指定的数据长度吗?
...全文
166 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
yhlovehx 2009-11-26
  • 打赏
  • 举报
回复
recv不用一个一个呢- -
我这边可以排序啊 打上序号 效验就行了
但是send的排序 问题就大很多了。。
yhlovehx 2009-11-25
  • 打赏
  • 举报
回复
楼上正解 非常感谢各位。。
只需要 同时 又多个未决 recv操作就行了。。
send就一个一个来吧 呵呵。。
makui 2009-11-25
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 yhlovehx 的回复:]
有问题噢
我连续2次调用WSASend 完成端口可以保证是按循序完成的。。
但是如果我第一次只发部分 那不乱套了吗
[/Quote]

事实确实如此,错误的做法并不表示每次都会有错误的结果。

正确的做法是一次完成了之后(不是指接到完成通知,而是确认数据都发送完成)再发下一次
lijianli9 2009-11-25
  • 打赏
  • 举报
回复
WSASend返回是将你提交的buffer中的数据拷贝到系统缓冲区发送,但是GetQueuedCompletionStatus返回的时候其中的dwIosize就是返回的本次系统缓冲区中发送成功了多少个字节,如果和你提交的大小不同,你要移动自己的buffer地址,然后再次提交,直至全部发送完全。
makui 2009-11-25
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 yhlovehx 的回复:]
楼上正解  非常感谢各位。。
只需要 同时 又多个未决 recv操作就行了。。
send就一个一个来吧 呵呵。。

[/Quote]

Recv 也应该是一个一个的来啊,呵呵,那不然就更要乱套啊
vincent_1011 2009-11-24
  • 打赏
  • 举报
回复

case ClientIoWrite:

//
// a write operation has completed, determine if all the data intended to be
// sent actually was sent.
//
lpIOContext->IOOperation = ClientIoWrite;
lpIOContext->nSentBytes += dwIoSize;
dwFlags = 0;
if( lpIOContext->nSentBytes < lpIOContext->nTotalBytes ) {

//
// the previous write operation didn't send all the data,
// post another send to complete the operation
//
buffSend.buf = lpIOContext->Buffer + lpIOContext->nSentBytes;
buffSend.len = lpIOContext->nTotalBytes - lpIOContext->nSentBytes;
nRet = WSASend (lpPerSocketContext->Socket, &buffSend, 1,
&dwSendNumBytes, dwFlags, &(lpIOContext->Overlapped), NULL);
if( nRet == SOCKET_ERROR && (ERROR_IO_PENDING != WSAGetLastError()) ) {
myprintf("WSASend() failed: %d\n", WSAGetLastError());
CloseClient(lpPerSocketContext, FALSE);
} else if( g_bVerbose ) {
myprintf("WorkerThread %d: Socket(%d) Send partially completed (%d bytes), Recv posted\n",
GetCurrentThreadId(), lpPerSocketContext->Socket, dwIoSize);
}
} else {

//
// previous write operation completed for this socket, post another recv
//
lpIOContext->IOOperation = ClientIoRead;
dwRecvNumBytes = 0;
dwFlags = 0;
buffRecv.buf = lpIOContext->Buffer,
buffRecv.len = MAX_BUFF_SIZE;
nRet = WSARecv(lpPerSocketContext->Socket, &buffRecv, 1,
&dwRecvNumBytes, &dwFlags, &lpIOContext->Overlapped, NULL);
if( nRet == SOCKET_ERROR && (ERROR_IO_PENDING != WSAGetLastError()) ) {
myprintf("WSARecv() failed: %d\n", WSAGetLastError());
CloseClient(lpPerSocketContext, FALSE);
} else if( g_bVerbose ) {
myprintf("WorkerThread %d: Socket(%d) Send completed (%d bytes), Recv posted\n",
GetCurrentThreadId(), lpPerSocketContext->Socket, dwIoSize);
}
}
break;
yhlovehx 2009-11-24
  • 打赏
  • 举报
回复
咋个 几个牛人还不进来看下呢
yhlovehx 2009-11-24
  • 打赏
  • 举报
回复
楼上的能发下 微软的相关代码吗 MSDN上没看到呢。
vincent_1011 2009-11-24
  • 打赏
  • 举报
回复
微软的源码有考虑这个情况。。。。。。。。。。
yhlovehx 2009-11-24
  • 打赏
  • 举报
回复
期待权威人物解答
yhlovehx 2009-11-23
  • 打赏
  • 举报
回复
暂时还没测出来。。。
但是不代表实际跑的时候不出来- -!!
期待权威。
Leo_red 2009-11-23
  • 打赏
  • 举报
回复
这个问题确实还是得有实际这么做过的人说话比较有分量,大部分兄弟们没有太钻这个问题啊
yhlovehx 2009-11-23
  • 打赏
  • 举报
回复
来个权威啊
yhlovehx 2009-11-22
  • 打赏
  • 举报
回复
来人啊- -
jasonM2008 2009-11-22
  • 打赏
  • 举报
回复
不太清楚!我觉得,IOCP,投递一个请求,完成后,才会往完成端口投递一个完成请求,按这个想法,我觉得应该不会吧!!如果你说的情况发生了,那不是投递一个请求,会返回多个完成请求包吗?不过我的想法,也不太肯定,期待权威来!!!或者你可以做个试验,快速的发大包!看看有没有这种情况发生!!!
yhlovehx 2009-11-21
  • 打赏
  • 举报
回复
在顶再顶
yhlovehx 2009-11-21
  • 打赏
  • 举报
回复
- -问题我是 测试 就还没出现这个问题。。
但是 那个返回有个值是实际的 大小。。
我就想请教个权威的 那个问题到底会不会发生- -
ucMIPS 2009-11-21
  • 打赏
  • 举报
回复
举个简单的例子,你往国外的服务器,通过512k的adsl上网,投递一个WSASend大小是512M的内存块,会出现什么事?你就可以马上测试一下的
yhlovehx 2009-11-20
  • 打赏
  • 举报
回复
继续顶
yhlovehx 2009-11-19
  • 打赏
  • 举报
回复
- -在顶下。。
加载更多回复(7)

18,356

社区成员

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

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