我也是初学者。看了很多处理粘包的代码和方案总结下来就3种方法
包长和实际包长对比
1.包长相等跳过
2.大于拆包
3.小于合并可是,我用线程也好 进程也罢 都出现一个问题。那个包是处理的完美啊 ,但是效率...
一个包 才几十秒 不大不大 
对了 补充下 我需要的是ClientSocket 高效分包代码
高手出手吧 我牙口好什么线程,进程都能消化
来吧! COME ON 别让人说DELPHI 的程序员都转行C++了,找资料 看C吧

解决方案 »

  1.   

    1. Design Protocol include error handling
    2. Parse the binary stream
      

  2.   

    http://tech.ddvip.com/2006-04/11440837203197.html
      

  3.   

    之所以粘包,是因为对tcp工作原理不了解所致,与delphi无关
      

  4.   

    http://blog.csdn.net/tigerii/archive/2009/08/18/4460292.aspx
      

  5.   

    不要用那个垃圾的clinetsocket 我以前也是用的这个 可以这么说 非阻塞式的socket控件都没办法解决粘包问题 indy是阻塞式socket 所以从根本上杜绝了粘包的可能 而且天生多线程 可以负载很大的负载连接量 后来我改用indy 那叫一个好用 腰也不痛了 气也不踹了 走路更有劲了 
      

  6.   

    就目前而言,此贴是0分! 有多大能耐说多大话,作为一个男人应该为自己的承诺负责!
    但给你一个那建议,你应该看看CNPack 控件包,里面有粘包的处理代码。而且还有IOCP的实例,都写得不错。
      

  7.   

    type
      TMyMemory=class
      private
      FBuff:array[0..8191]of byte;
      FSeek:integer;
      FCount:integer;  public
      procedure Add(const buf;Len:integer);
      procedure Read(var buf;Len:integer);
      constructor Create;
      end;constructor TMyMemory.Create;
    begin
      FCount:=0; FSeek:=0;
    end;procedure TMyMemory.Add(const buf;Len:integer);
    begin
      move(buf, FBuff[FCount] ,Len);
      inc(FCount);
    end;procedure TMyMemory.Read(var buf;Len:integer);
    begin
      move(FBuff[FSeek],buf,Len);
      inc(FSeek);
      if FSeek=FCount then
      begin
      FCount:=0; FSeek:=0;
      end;
    end;
      

  8.   

    逗死我了,粘包和控件有关?ClientSocket收到什么数据,就往一个大缓冲里放,这种样就解决了分包的情况,再找包头和包尾,校验数据,就能确定缓冲里的每一包数据,处理,从缓冲中删掉这一包数据。这样就能处理每一包,解决了粘包。Indy控件正因为封装了多线程,所以才有它的致命弱点。"可以负载很大的负载连接量", 不知道是指有多少个,我是没有试过,但是我的同事试过Indy9的TIdTCPServer连上100多个客户端就出问题。Windows2003里,在不改参数,每个进程的线程可以达到2000个, 那意味着程序可以连上2000个客户端, 如果改了参数可以连上更多。负载连接量是由操作系统决定的。如果需要更大的负载量,最好在Linux下做服务端,每个进程最大可以占3G的内存, 只要调整好堆栈的大小,每个进程可以开上万个线程,也是能连上万个客户端。
      

  9.   

    楼主啊,delphi不适合你,赶紧转C/C++吧,转了以后如果还是不适合(十有八九),那就转行当老板吧