上面是一个网友的评论(是匿名评论,无法直接向该网友提问).俺的问题是关于这段话的.俺理解他的意思是:
调用 WSASend(), 返回错误,  
WSAGetLastError()取得错误号 != WSA_IO_PENDING
这时,按照MSDN文档介绍, GetQueuedCompletionStatus()不会返回, 
"no completion indication will occur." ---MSDN原文
但上面的评论的意思则是, 事实上不是如此,俺的问题就是:
1. 大家有没有遇到过这种特别的情况?
2. 他说"有时候不会返回FALSE" 是指不返回值(即不引发完成事件),还是指有时返回TRUE?
从字面看俺猜是前者, 不过想请 有丰富IOCP经验的同志 拿一个肯定意见.
3. 遇到这样的错误应该怎样处理?

解决方案 »

  1.   

    没有碰到过这种情况,不知道那个网友说的是否正确,
    应该找IOCP的源码看看,就知道了
      

  2.   

    icop还没有研究的很透彻,
    帮你顶一下吧
      

  3.   

    你应该检查一下出现这种情况时,发起异步Send的WSAGetLastError()返回值
    如果返回的是网络错误,那么之前发起的异步操作必然导致GetQueuedCompletionStatus返回错误对GetQueuedCompletionStatus的返回结果进行判断是必须的
    现在基于完成端口的成熟软件相当多了,我不认为完成端口设计的有问题
    “IOCP设计者的确是猪”说这句话的人恰恰说明了他自己的水平
      

  4.   

    嗯,该同学言语有点偏激, 不过俺想, 他应该是遇到过那种特别情况.我们可以将问题简化一下,只考虑最关键的.
    当提交 WSASend() 后,GetQueuedCompletionStatus() 返回FALSE,
    它的 *lpNumberOfBytes 可能大于0吗?  也就是说,它会否已经send出了部分数据呢?
      

  5.   

    调用 WSASend(), 返回错误, 
    WSAGetLastError()取得错误号 != WSA_IO_PENDING
    这时,按照MSDN文档介绍, GetQueuedCompletionStatus()不会返回,
    "no completion indication will occur." ---MSDN原文 
    俺确认一下,
    而 unsigned 在7楼的意见就是, MSDN的描述是可靠的?
    俺在5楼提的问题也就不存在了?
      

  6.   

    调用 WSASend(), 返回错误,
    WSAGetLastError()取得错误号 != WSA_IO_PENDING
    这时,按照MSDN文档介绍, GetQueuedCompletionStatus()不会返回,
    "no completion indication will occur." ---MSDN原文
    俺确认一下,
    而 unsigned 在7楼的意见就是, MSDN的描述是可靠的?
    俺在5楼提的问题也就不存在了?
      

  7.   

    MSDN的描述基本可靠,BUG很少(这点非常值得我们学习,看看人家的文档写的,我们有几人能做到?)
      

  8.   

    问题存在那叫BUG,那是MS所需要关心的。要知道IOCP可是从NT3.51就有了,到win2k就已经相当成熟了,而后的Winxp SP2和Win2k3 SP1已经做了相当的完善。当前的Vista更是做了相当的扩充。如果你连 MSDN都不信,又凭什么相信某一个网友的话?谁比谁更权威?仅仅只是个人使用偶然性的问题,在没有任何证据论证的情况下说某一操作系统有问题,那往往是某些人为开脱自己责任的一个借口,仅仅只是一个借口。当然,我们不能排除的是,第三方软件(比如防病毒软件/防火墙)从中作梗,但问题也不至于如此不靠谱,不管如何非刻意作为,几乎不可能更改服务系统的执行逻辑。
      

  9.   

    我想问的是仅仅只是某一个网友,与MSDN相比,谁更权威?