当在完成端口中.如下使用.结果会如何?谢谢比如:
WSASEND("aaa");
WSASEND("bbb");会不会出现发出的结果合并?如:"aababb"这样的效果?这样的操作.是不是就要等一个操作完成再作下一个操作才能不出现这样的情况?请高手指教.谢谢

解决方案 »

  1.   

    第一个WSASEND只发出了"aa"返回了完成消息,因为没发完.所以还要发.
    第二个WSASEND也是一样.发了一个"b"返回了完成消息.因为没发完.还要发.这样会不会出现上面的效果?在一个socket上.
      

  2.   

    不仅仅是完成端口,TCP协议都会如此
      

  3.   

    也就是说.如果要确保发送的数据不合并.就要等第一个发完.再来发第二个.对吗? elssann(臭屁虫和他的开心果) 谢谢你.
      

  4.   

    估计不会吧,虽然是异步,但由于也是TCP协议,所以应该是能够保证aaa发完了才能够发bbb的。不然的话,还叫什么面向连接的,可靠的协议?
      

  5.   

    合并,而且即使缓冲区设为0(这样做在完成端口中不是个好主意,会LOCK住内存,有时候会使单个线程都LOCK掉,使TDI层的内存缓冲不工作)的话,接收的时候不及时接收还是会合并的。自定义边界才是解决之道。
      

  6.   

    我觉得问题不在于TCP本身,什么情况下会出现:
    WSASEND("aaa");
    WSASEND("bbb");
    如果程序被设计成这样,这就是协议设计问题了。
    现在很流行完成端口,很多帖子都在问这些问题,实际上完成端口只是一个基础框架,真正的传输协议
    还是要自己去设计,看看pop3,smtp,ftp,http这些协议,还有很多开源的p2p,他们是怎么进行封包和解包的!
      

  7.   

    写过驱动的人应该对完成端口最理解,因为上层所有的请求都会转化为irp终端请求包,这是nt的核心——等我做干了就发消息告诉你!
      

  8.   

    呵呵,不用写驱动也知道,因为完成端口部分的原代码在2K泄漏出来的原代码里。不光是NT的核心吧。
      

  9.   

    TCP协议是基于流的协议,能保证可靠传输,在一端收到的序列与传送一端的序列应相同.完成端口虽是异步方式,但实际经网卡流出的序列还是同步的,上面所说的这些现象是不会存在的.如果存在的话,找微软去算帐.
      

  10.   

    就是由于是消息列队.那那第一个WSASend没有完全发送.这时完成全处理第二个WSASend.这时第一个再接上次发送.就会把数据混起来了.不是这样吗?
      

  11.   

    感觉写windows层程序的人,真是不知有汉,无论魏晋啊,呵呵,开个玩笑,七猫前辈,握个手
      

  12.   

    怎么还在讨论???这种情况不会发生!!
    你们没有弄清楚“粘包”与“混包”的区别。楼主的意思是会不会“混包”,明确地说这是不可能发生的。“粘包”指的是本来发送了两次包“aaa”“bbb”,而在接收端一次就接收完了“aaabbb”。如果接收端不能足够快地接收包,“粘包”是可能的。而“混包”是不可能的,在接收端不可能接收到“aababb”,否则,象bob640所说,去找微软算帐去。
      

  13.   

    send会返回你发送的字节数.并且.这个值是<=实大小的.就是说.不一定会一次全发出去.那么第一个不一定会一次全发完.第二次就已经发了.这时是不是就出现“aababb”了?
      

  14.   

    没看清楚楼主的帖子,楼主:
    1:TCP下,包的顺序不会乱。
    2:TCP协议下粘包是不可避免的 ,即使设置那个什么nodelay选项。或者关闭nagel算法。
    除非你在应用层控制,做到每收到一个包就应答一次然后回应。
    3:IOCP其实就是一个异步IO和一个消息队列,自己都可以实现一个。还有,并不是完成端口才
    是把请求转换成IRP,事实上 ,凡是涉及到和WINDOW KERNEL通信的东西,基本上都是
    以IRP形式提交给KERNEL的。
      

  15.   

    回复人:cnvvv() ( ) 信誉:62  2004-10-21 11:16:00  得分:0

    send会返回你发送的字节数.并且.这个值是<=实大小的.就是说.不一定会一次全发出去.那么第一个不一定会一次全发完.第二次就已经发了.这时是不是就出现“aababb”了?---------------------------------------------------------
    这种情况会出现。所以一般要吧WSASEND设置成线性的。发完第一个再发第二个
    所以对于单个连接来说,IOCP并不一定比别的模型性能高多少。重要的是异步IO用
    几个线程就能处理很多连接,这才是IOCP的 作用。
      

  16.   

    终于说到重点了.感谢你的讲解.elssann(臭屁虫和他的开心果)我现在是程序上以线性方式工作.你说的设置成线性.是有什么参数可以设置的吗?谢谢最后一问.答后结帖了.感谢大家的参与.
      

  17.   

    回复人:cnvvv() ( ) 信誉:62:没方法设置,自己程序结构上设计好,如果某个SOCKET上当前正在发送,也就
    是前一个WSASend的数据包还没有完全发送完毕,就不允许再发送,只有上一个
    包完全发送完成了才允许发送下一个。
    这样虽然看起来和阻塞的SOCKET相比没什么性能优势,但是政如我上面说的:
    IOCP的优势在于可以以几个线程处理很多连接,从总体上看,这不受影响。
      

  18.   

    >>IOCP其实就是一个异步IO和一个消息队列,自己都可以实现一个
    能举例吗?