关于IOCP,某些地方就是不让人彻底舒服(WSASend重叠post数据)

开门见山,直接就事论事。

 

假如有这么一个基于IOCP模型的Server,这个Server提供的所有服务中有这么一种服务……文件下载,我们再假设Server端存有一个20G的文件,客户端这时发送一个请求到服务端来,客户端要求下载这个20G的文件,由此可能引发一系列让人头疼的问题(不谈TransmitFile,我们谈WSASend)

 

先给出一段伪代码,这段代码肯定是有问题的,如下:

[html] view plaincopy

  1. //在某个线程里,我们开始向某个客户端疯狂发送这20G的文件了  
  2. while(true)  
  3. {  
  4.     char *data=new char[PER_SEND_DATA_LEN];  
  5.   
  6.     ::ReadFile(...,data,PER_SEND_DATA_LEN,&len,...);  
  7.   
  8.     io_data.wsabuf.buf=data;  
  9.     io_data.wsabuf.len=len;  
  10.     ::WSASend(...,&io_data.wsabuf,...);  
  11.   
  12.     delete []data;  
  13.       
  14.     if(len<PER_SEND_DATA_LEN) break;  
  15. }  

这样无节操的发送基本上会得到一个WSAENOBUFS(缓冲区不足)错误,这个不是什么大问题,不会影响到IOCP底层模块的设计,值得注意的是下面一个问题——数据发送不完全

 

接着上面的例子继续思考下去。

假如其中一个WSASend投递长度为PER_SEND_DATA_LEN的数据,而GetQueuedCompletionStatus(...,&BytesTransferred,...)返回结果却表明这次发送没有进行完全,BytesTransferred<PER_SEND_DATA_LEN,而后续的WSASend函数正源源不断地投递新的请求,即使我们在Get函数返回后,再次投递WSASend请求补发剩余数据,也无法保证这样的补发可以赶在其他WSASend的前面。

 

如果以上推测成立的话,那么数据将不可避免的出现乱序。

 

当然,这只是一种担心,实际上到目前为止,本人还没有遇到过这种情况,个人认为:这种情况应该不会发生,一定是哪些地方还没有搞透彻,否则重叠的意义何在?不过,网上担心这种情况的人也不少,以下是提出这些问题的链接(不保证都是原创):

http://blog.csdn.net/skiing_886/article/details/8044186

http://bbs.eyuyan.com/read.php?tid=306324

 

上面两个链接中,其中一个是篇博客,博客中明言WSASend带重叠结构投递请求时,不会出现数据发送不完全的情况,本人比较容易相信别人,于是我就信了。就算那篇博客说错了,本人也还是觉得数据乱序的情况不会发生。

 

下面,本人想就这个问题,结合IOCP的完成队列说一些自己的猜想(完全是猜想,假设WSASend所投递的数据有可能发送不完全)。

首先,IOCP维护着一个的队列,这个队列没有好妖魔化的,就是一个先进先出的数据结构,效率很高就是了。问题是,是不是我们每次调用WSASend都将导致一次入列,而每次GetQueuedCompletionStatus函数返回都会导致一次出列呢?

 

结合上面的那个下载文件的例子,细细一想,如果每次GetQueuedCompletionStatus返回都要出列一次数据包的话,那一旦出现数据发送不完全的情况,即使我们再次调用WSASend补发,那也只能将数据附加到完成队列的头部,乱序是必然的。

 

但是,换个思维,这种问题连我都能想到,微软那么多高智商人才难道都是吃干饭的吗?

 

所以,我认为,当数据发送不完全的时候,GetQueuedCompletionStatus应该是不会出列数据的,而可能是占着茅坑不拉屎,等待WSASend再次补发未完成的数据发送,而这个WSASend肯定不会导致数据数据重新入列,而只是给一个继续发送的信号。

 

如果是我的,我肯定会这样设计,否则,那就只能采取保险的做法,WSASend不重叠投递,一次投递之后需要等待Get函数返回再决定是要投递一个补发的WSASend请求还是投递下一个完整数据包的WSASend请求。这种做法虽然保险,但这突出了IOCP的巨大缺陷,正如我前面所说的,重叠的意义何在?WSASend还有必要带着个OVERLLAPED结构吗?

 

所以,我认为,这种情况的数据乱序不可能发生,不用担心,嗯,不担心……

 

说到最后,再顺便提一下STL。STL的出列操作是Pop,它是不带任何返回值的出列,要想知道出列了什么数据必须在Pop之前调用front方法。有人强烈鄙视这种设计,认为这种设计极其别扭。要知道,STL的设计者必然是高手,设计成这样自然有理由,队列这种东西,要想通用的话,最好还是要把‘看’和‘取’分开,STL的设计是综合考虑的结果。

时间: 2024-08-30 19:27:09

关于IOCP,某些地方就是不让人彻底舒服(WSASend重叠post数据)的相关文章

在Win8邮件应用中读取人脉应用中的联系人数据的方法

Win8系统中,"邮件"和"人脉"都是Windows系统提供的Metro风格的应用,二者可以进行良好的互相配合.通过"人脉"应用,我们可以快速方便地往"邮件"中添加联系人. 你可以在"人脉"应用中查看.添加和编辑你的帐户的联系人,同时在"邮件"应用中管理同一帐户的电子邮件. 如果你的电子邮件地址以 outlook.com.live.com.hotmail.com 或 msn.com 结尾

阿里云数据库掌门人褚霸:骑行与数据人生

本文主要从霸爷的骑行经历开始聊起,进而联系到数据库经历,从初识数据库谈及到云下转入云上,最后重点与大家分享了POLARDB 数据库.   今天的电梯访谈我们请来了褚霸和我们聊聊他的骑行与数据库人生. 以下是精彩内容整理: 骑行有很多乐趣,骑行给我无拘无束的感觉,骑行是一种激情,让我兴奋,享受着超越感.而数据库与骑行对我来说是相通的,坚持去做的事情一定是你有兴趣的事情,没有激情是很难做到极致,数据库与骑行一样,没有上限,投入精力越多,探索深度越深. 初识数据库 "我的梦想是做一个最牛X的数据库!&

现在人都不用请,大数据的使用门槛又降低了

2011 年,IBM 研发的 Watson 计算机在著名益智节目 Jeopardy! 上击败众 多人类对手,赢得冠军.此后,有关这台传奇计算机的新闻层出不穷,特别是在 2013 年末,IBM 宣布开放 Watson 的 API,并向开发者免费提供工具,让开发者可以调用 Watson 自然语言查询引擎.向广大开发者开放,只是 Watson 走向主流的其中一步.最近,IBM 发布了Watson Analytics,把 Watson 和 IBM 的大数据分析.云计算平台相结合,免费提供给所有需要数据分

出国的人注意了:怎样防止数据在美国边境上被搜查

过去2年,美国海关及边境保卫局(CBP)对入境游客的智能手机和笔记本电脑的搜查力度是越来越大了. 美国法庭基本上将边境搜查定为宪法第4修正案的例外情况看待,CBP不用法庭签署的搜查令就可以查阅电子设备.今年4月,一组立法者引进了相关立法,要求搜查美国公民及其他合法居民所持电子设备时需要有搜查令.然而,目前为止,法律还是允许无令搜查设备. 不过,值得指出的是,CBP搜查单个旅客设备的时候并不多,除非该旅客符合特定描述.尽管过去2年间设备搜查有所增加,CBP依然仅检查跨越国境的所有人中大约1%的设备

石油济柴关联交易惹人疑同一资产真假两份数据

9月11日,<大众证券报>报道了<石油济柴低价转让最赚钱资产>一文,质疑石油济柴(000617)拟以较低的市场价格转让公司最优质的资产,引起了市场的强烈关注.与此同时,记者还发现,公司对于拟转让的资产,却给出了两份截然不同的财务数据报告:计划转让前,转让资产创造的投资收益占公司09年净利润的90%:而公司最新出具的资产转让报告显示,转让资产的投资收益占公司09年净利润的比例由90%"悄然"下调至49%. 关联交易价格偏低 一切事由来源于石油济柴近期筹划的关联交易

完成端口(IOCP) 也可以这样用~~呵呵~ 用来充当线程之间的数据队列~

// Test32.cpp : 定义控制台应用程序的入口点.//#include "stdafx.h"#include <stdlib.h>#include <windows.h>#include <process.h>#include <iostream>HANDLE m_hCompletionPort;volatile BOOL m_bShutDown;struct TESTOVERLAPPED{    OVERLAPPED    m

跟本地人玩起来 做地方论坛活跃人气的方式解密

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 现在的网站众多,并且在这个网站林立的年代一个网站想要得到好的排名好的人气更是难上加难.地方网站也是网站大军中不容忽视的一股力量.但是众多的地方网站都有着一个致命的问题就是人气低沉.随着网站竞争的加剧,地方网站就必须要发挥自己所有力量跟本地人玩起来,才能够活跃地方论坛的人气.但是地方论坛活跃人气也需要方法,例如下面的这三种方法. 一,以网站名义

新浪微博如何搜索关注人的微博?

  目前有两个地方可以搜关注人的微博: 1.自己的微博首页:新版微博首页搜索框输入关键词默认即为关注人的微博.旧版:展开首页搜索安排的三角箭头展开"高级搜索",输入关键字即可搜索到关注人说的话. 2.搜索结果页:进入微博搜索页面,点击"高级搜索"按钮,输入关键词,类型选择"我关注的"点击搜索即可搜到关注人的微博. 同时,也可以输入关键词在结果页面点"我关注的",两种搜索都可以找到你要的结果.

运营人必备的7大技能:数据分析能力是未来运营的分水岭

以流量为中心.野蛮的运营时代已经结束,接下来的时代是以科学的数据作为依据,围绕着用户紧紧做精细化的运营时代. 我之前在文章<后产品时代的运营之道:数据分析的五种方法论>提到: 数据驱动运营是未来运营的趋势,也是我们运营人的一个分水岭,在运营的刀耕火种时代已经趋于没落的时候,精细化运营以及变得尤为重要,数据驱动决策是我们运营人必须要面对的挑战也是我们要下意识学的一门技能. 但也是很多刚进入运营领域的新人一个头疼问题,因为他所涉及到的数据分析方法.方法论.逻辑分析能力以及一些工具的使用,而且一堆数