iocp完成端口的疑问

jishufenxi 2008-07-26 04:02:27
1、基于iocp的socket,如果进行send,不发生异常的情况下,在GetQueuedCompletionStatus返回时收到的完成字节数是否一定等于send的字节数?
2、类似的问题,基于iocp的file,执行write,不发生异常的情况下,在GetQueuedCompletionStatus返回时收到的完成字节数是否一定等于write的字节数?
3、什么情况下完成数!= send或write数?
4、不发生异常的情况下,是否每一次异步操作对应着有一次GetQueuedCompletionStatus返回?
...全文
130 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
ruoge2007 2009-07-03
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 unsigned 的回复:]
1、基于iocp的socket,如果进行send,不发生异常的情况下,在GetQueuedCompletionStatus返回时收到的完成字节数是否一定等于send的字节数?
>>这是一个具有争议的问题,大部分人趋向于可以保证完成和字节数与发送的字节数一致.但是MSDN并没有明确说明是能保证还是不能保证,反倒是MSDN当中的实例(参见Microsoft Windows Platform SDK当中的Sample),却在收到GetQueuedCompletionStatus消息之后对这个进行了判断,并且还对相差的字节…
[/Quote]

牛人
WinEggDrop 2008-07-26
  • 打赏
  • 举报
回复
1.你说的是单次还是所有次数加起来?如果是所有send的话,是的.如果只是单次的send()和单次的GetQueuedCompletionStatus(),那不一定是相等
2.如1
3.如果是单次send或write,发送方的带宽不足或其它资源不足,都可以导致不相等.
4.是
僵哥 2008-07-26
  • 打赏
  • 举报
回复
1、基于iocp的socket,如果进行send,不发生异常的情况下,在GetQueuedCompletionStatus返回时收到的完成字节数是否一定等于send的字节数?
>>这是一个具有争议的问题,大部分人趋向于可以保证完成和字节数与发送的字节数一致.但是MSDN并没有明确说明是能保证还是不能保证,反倒是MSDN当中的实例(参见Microsoft Windows Platform SDK当中的Sample),却在收到GetQueuedCompletionStatus消息之后对这个进行了判断,并且还对相差的字节数进行了重发处理,依此来看Microsoft都不能确定一定能在完成通知的时候把所有数据发送完.但是众多用户对这个测试的结果却并没有碰到过不能发送完的情况,所以就存在一个是否需要做进一步处理的争论.为保证程序的稳定和有效性,个人还是建议做一个判断,毕竟这个消耗并不会太大.

2、类似的问题,基于iocp的file,执行write,不发生异常的情况下,在GetQueuedCompletionStatus返回时收到的完成字节数是否一定等于write的字节数?
>>同1

3、什么情况下完成数!= send或write数?
>>在中途发生异常,比如网络掉线,比如磁盘已满等等可能对send/write产生影响的情况.

4、不发生异常的情况下,是否每一次异步操作对应着有一次GetQueuedCompletionStatus返回?
>>异常分为两种,一种是标准异常,我们可以把它称为业务异常,例如掉线等等,另一种是由于软件内部或外部存在非预期的错误的违例.对于前者所产生的异常以及不发生异常的情况下,一个Overlapped操作对应着一个GetQueuedCompletionStatus通知(未决操作除外),对于后者,在相关内存没有遭到破坏的情况下,同前者,一旦相关内存遭到破坏,包括如内存溢出操作,野指针访问等等,则后果是不可预期的.
cppwin 2008-07-26
  • 打赏
  • 举报
回复
读写文件与网络收发略有区别,一般完成字节数等于投递字节数.
但这不能作为依靠,仍需要处理意外情况.

18,356

社区成员

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

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