CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  网络编程

完成端口的问题,如果我在一个sock上投递10个recv,那么这10个recv完成并返回的顺序肯定是按照流的顺序的吗?

楼主wd_6532(用frontpage写asp,jsp,php,ace)2006-07-27 15:51:53 在 VC/MFC / 网络编程 提问

rt 问题点数:20、回复次数:30Top

1 楼fengge8ylf(秀视工作室,承接P2P项目)回复于 2006-07-27 19:47:53 得分 1

唤醒等待的线程应该是按顺序的Top

2 楼louifox(兰陵笑笑生)回复于 2006-07-27 21:57:42 得分 1

一.这10个recv完成并返回的顺序不一定按照流的顺序  
   
  二.工作线程的唤醒是按照LIFO方式的Top

3 楼wd_6532(用frontpage写asp,jsp,php,ace)回复于 2006-07-28 09:24:27 得分 0

一.这10个recv完成并返回的顺序不一定按照流的顺序  
  ==================================================  
  照你这么说,我的工作线程的第一次被唤醒收到的数据不一定是从流头开始的数据。  
   
  那我怎么维护我的数据的连续性?Top

4 楼fengge8ylf(秀视工作室,承接P2P项目)回复于 2006-07-28 09:26:32 得分 1

这10个recv完成并返回的顺序很可能按照流的顺序Top

5 楼freebird001(自由鸟)回复于 2006-07-28 11:40:34 得分 1

IOCP的GetQueuedCompletionStatus是LIFO,而I/O是FIFO  
  参考   MSDN   Writing   Scalable   Applications   for   Windows   NT  
   
  偶以为投递多个WSASend可以理解,但是投递多个WSARecv没有必要  
  Top

6 楼fengge8ylf(秀视工作室,承接P2P项目)回复于 2006-07-28 12:51:06 得分 1

但是投递多个WSARecv没有必要  
  -------------  
  的确如此Top

7 楼wd_6532(用frontpage写asp,jsp,php,ace)回复于 2006-07-28 13:18:45 得分 0

为什么没有必要?Top

8 楼wwwllg(野蛮人)回复于 2006-07-28 13:22:52 得分 1

有必要。且是非常有效的提高接收的一种方法。慢慢去领会吧。Top

9 楼fengge8ylf(秀视工作室,承接P2P项目)回复于 2006-07-28 14:57:03 得分 1

投递一个WSARecv 接收到数据后不要立刻处理而是把他暂存 立刻接收下一个数据 另起一个或多个线程去处理数据  这种方式不见的效率低  而且最重要的是可能不用考虑包的顺序Top

10 楼wd_6532(用frontpage写asp,jsp,php,ace)回复于 2006-07-28 15:12:41 得分 0

而且最重要的是可能不用考虑包的顺序  
  =======================  
  哪有包的概念?  
   
  如果你每次投递4096字节,那么可能第一次收到的是2字节,第二次收到的是5字节(数字是假设的)  
   
  如果没有顺序,你怎么知道2字节在前面还是5字节在后面。Top

11 楼freebird001(自由鸟)回复于 2006-07-28 18:50:03 得分 1

wwwwllg   said:有必要。且是非常有效的提高接收的一种方法。慢慢去领会吧  
   
  =======================>  
  如果投递多个WSARecv,要考虑包的处理顺序,容易出WSAENOBUFS问题,程序处理上会困难.  
  而每次在WSARecv的Get事件来时立即再投递一个WSARecv   ,也充分的利用了I/O了阿?  
  Top

12 楼jadetiger(白玉老虎)回复于 2006-07-28 19:43:20 得分 1

偶以为投递多个WSASend可以理解,但是投递多个WSARecv没有必要  
  _________________________________________________________________________  
  千万不要投递多个wsarecv,和多个wsasend,那样的话很可能不小心就改变了收发包的本来顺序  
  对wsasend来说,同时post两个,但第一个很可能没有完全部发送成功,对多个wsarecv来说,多个线程调用的情况下,如果两个线程同时收到了数据,很难决定哪个在前哪个在后Top

13 楼louifox(兰陵笑笑生)回复于 2006-07-28 19:46:12 得分 1

wwwwllg   said:有必要。且是非常有效的提高接收的一种方法。慢慢去领会吧  
  -------------------  
  谈不上非常有效,如果要以增加程序逻辑处理的复杂度为代价就很不划算了.Top

14 楼fengge8ylf(秀视工作室,承接P2P项目)回复于 2006-07-28 19:53:19 得分 0

哪有包的概念?  
  ----------  
  这里的包也就是数据   呵呵     平时说包说习惯了Top

15 楼louifox(兰陵笑笑生)回复于 2006-07-28 20:01:29 得分 0

应该是指应用层的数据包,呵呵Top

16 楼fengge8ylf(秀视工作室,承接P2P项目)回复于 2006-07-28 20:12:56 得分 0

为什么这么多人对IOCP有这么多的疑问   就是因为大家不知道IOCP底层(或代码)是怎么实现的  
  ,为什么不知道是因为是微软写的,而微软不会告诉你。这就是差距。这就是为什么要自主研发   这就是为什么要拥有自己的核心技术   这就是基础工作的重要性Top

17 楼huangbeyond(校园人渣)回复于 2006-07-30 00:49:07 得分 1

wwwwllg   said:有必要。且是非常有效的提高接收的一种方法。慢慢去领会吧  
  -------------------  
  谈不上非常有效,如果要以增加程序逻辑处理的复杂度为代价就很不划算了.  
   
   
   
  非常赞同.尤其是1次1个recv,可以避免了"粘包"现象.Top

18 楼unsigned(僵哥(发站内消息,请附上链接或问题说明,否则不予回复))回复于 2006-07-30 02:20:59 得分 1

关于针对同一个Socket投递多个Recv,至少要分两种情况。  
  1.面向非连接的  
      此时Recv返回的顺序是按照投递的顺序(FIFO),但是得到的数据包是无序的.  
  2.面向连接的  
      10上Recv将会按投递的顺序返回(FIFO),同时得到的数据也是连续的。但是,在第一个Recv未完成之前,第二个Recv是不会象预期的那样也同时接收下一段数据。因为同向网络I/O过程当中,也是有序的,并且只有单一通道(目前尚且如此,将来会否改进不得而知,毕竟现在的网络线路当中,至少已知的8线当中,有两线是未使用的),而且对于面向连接的由于对方(发送方)需要保证数据包发送的顺序,至少会在内核当中处理一种半阻塞状态,必须要确认当前这个数据包发送已经成功(不成功则重发),才会重新发送下一个数据包。当然在这当中你的网络效率相当高,并且收到的数据包的处理时间相当长时,也就是瓶颈发生面收到的数据包的处理过程当中,可以考虑投递多个Recv,不过如果不是阻塞模式下,这多个Recv是否按序返回,似乎并不重要,只要你处理时按照数据包的接收顺序处理即可。Top

19 楼unsigned(僵哥(发站内消息,请附上链接或问题说明,否则不予回复))回复于 2006-07-30 02:30:28 得分 1

另外还有一点问题就是,如果你单一向一个socket提交了10个Recv,同时这个Socket所处的连接上网络效率相比其它连接的效率高出许多时,由于线程数量的有限,很可能对其它连接会造成不利的影响,甚至可能另一连接等得超时了,还没得到线程处理,而再发送时线程又被之前的连接所占用,再说,你如果对一个socket可以投10个,未必其它的连接就只投递一个。此时的服务器架构设计也相当有争议性,看不去对于客户来说,似乎蛮有“弱肉强食”的味道,这似乎在服务器设计过程当中也是一种禁忌。如果是未服务端的设计倒是可以考虑使用,但是Recv的数量需要按线程的数量以及单一数量包的处理时间折中考虑.Top

20 楼df8327(DF)回复于 2006-07-31 10:10:32 得分 1

我虽然不知道 多个WSASend或者WSArecv是否能提高效率,但是有一点可以肯定  
  就是 多个发送或者接受操作 会给程序的编写和调试带来极大的麻烦  
  血的教训啊Top

21 楼unsigned(僵哥(发站内消息,请附上链接或问题说明,否则不予回复))回复于 2006-07-31 11:33:01 得分 1

我虽然不知道 多个WSASend或者WSArecv是否能提高效率,但是有一点可以肯定  
  就是 多个发送或者接受操作 会给程序的编写和调试带来极大的麻烦  
  血的教训啊  
  ========================================  
  这个只能靠个人的经验和水平了.Top

22 楼wd_6532(用frontpage写asp,jsp,php,ace)回复于 2006-07-31 13:32:05 得分 0

unsigned(僵哥(为什么我会到这里来……))    
   
  的叙述太精深了。  
   
  你讲的这些,从哪儿可以看到完整的资料?Top

23 楼rageliu(天气好了就去长白山看水怪去了,嘿嘿...)回复于 2006-07-31 15:52:27 得分 1

没特殊需要一次一个WSARecv(),完成例程里面处理了再WSARecvTop

24 楼unsigned(僵哥(发站内消息,请附上链接或问题说明,否则不予回复))回复于 2006-07-31 15:59:12 得分 1

抱歉,我也实在难为情,仅仅只是一此个人经验和理论.Top

25 楼wd_6532(用frontpage写asp,jsp,php,ace)回复于 2006-08-01 10:24:41 得分 0

upTop

26 楼wd_6532(用frontpage写asp,jsp,php,ace)回复于 2006-08-01 17:11:57 得分 0

我虽然不知道 多个WSASend或者WSArecv是否能提高效率,但是有一点可以肯定  
  就是 多个发送或者接受操作 会给程序的编写和调试带来极大的麻烦  
  血的教训啊  
  =======================  
  你曾经有什么   血的教训?  
   
  说来听听吧,告诫大家。Top

27 楼hidetowar(审时度势,用舍行藏)回复于 2007-03-06 18:17:47 得分 1

如果每个包都是一个完整的协议包,这种方式可以极大提高效率。  
  比如短信之类的东西。Top

28 楼yxfchinacq(随风飘飘)回复于 2007-03-07 01:00:45 得分 1

设计包的时候就应该考虑这个问题,最好控制在1k以下,毕竟iocp不是用来进行文件传输的Top

29 楼wj19781215()回复于 2007-03-14 11:28:26 得分 1

不一定,应自己维护投递序号才能正确接收。Top

30 楼wwwllg(野蛮人)回复于 2007-03-14 15:59:40 得分 0

wwwwllg   said:有必要。且是非常有效的提高接收的一种方法。慢慢去领会吧  
  -------------------  
  谈不上非常有效,如果要以增加程序逻辑处理的复杂度为代价就很不划算了.  
   
   
   
  非常赞同.尤其是1次1个recv,可以避免了"粘包"现象.  
  ------------  
  在Udp中多个res是很有必要的  
   
  一次一个res一样可以出现"粘包"现象.  
  Top

相关问题

关键词

得分解答快速导航

  • 帖主:wd_6532
  • fengge8ylf
  • louifox
  • fengge8ylf
  • freebird001
  • fengge8ylf
  • wwwllg
  • fengge8ylf
  • freebird001
  • jadetiger
  • louifox
  • huangbeyond
  • unsigned
  • unsigned
  • df8327
  • unsigned
  • rageliu
  • unsigned
  • hidetowar
  • yxfchinacq
  • wj19781215

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo