1.客户端发一串字符,服务器反应,客户端再发,服务器再反应。这种模式会发生粘包吗
2.不同客户端的包会粘包,还是只有同哥客户端的包才会粘再一起。
3.还有remobjects套件是不是也会粘包
现在才知道粘包问题,麻烦知道的朋友帮我解答一下。谢谢

解决方案 »

  1.   

    indy不会粘包,remobjects不清楚,TCP粘包是指发送方发送的若干包数据到接收方接收时粘成一包,进程之间不会互相影响,而根据这个定义,1的问题会造成粘包
      

  2.   

    网络通信应该都有粘包的可能。也困扰了我很久。最后的解决办法是:发送端创建一个发送缓冲区,用 AddSendBuffer(AData:Pointer;ALen:Integer) 的方式将用户数据包加入到缓冲区.用另一个线程,从缓冲区的另一头取定长,比如说是 1024字节点长度的数据,加上包头形成一个发送数据包。
    接收端也是创建一个接收缓冲区,将收到的每个发送数据包中的用户数据都按顺序放在缓冲区中。一个线程根据数据内容来确定是否接收完成一个用户数据包。完成后就给上层应用程序发一个消息。应用程序取到数据后将缓冲区中的对应数据删除。
      

  3.   

    缓冲区中数据头的位置 画错了,应该在绿色的后面。在要加数据就加到绿色的后面,如果缓冲区满了,就从头开始,如果前面也没有空位了,就将缓冲区扩大,或暂停向缓冲区中加数据。上面是发送缓冲区,里面的每个颜色是用户数据包。
    发送线程只按固定的大小A 从缓冲区中取数据,加上顺序号和数据大小A(如果最后缓冲区数据大小比A小,则保存实际的数据大小),形成发送数据包。接收端收到数据后,检查收到的数据中有多少个发送数据包,将数据包中的数据按顺序放在接收缓冲区中,如果发送数据包让截断了,则等一下个接收事件中取得后面的内容。检查到形成了一个用户数据包了,则给上层应用发消息。里面主要用户的就是内存指针的移动,复制,删除的操作。缓冲区其实是个循环队列。要注意在向缓冲区添加数据的时候要用临界区进行锁定,因为同时发送线程还在读取数据。
    接收缓冲区也是同样的。
    将发送缓冲区和接收缓冲区和实现成一类使用就更方便了。
      

  4.   

    粘包跟用什麼沒關系。你在TCP下做都有可能粘包Head+Command+DataLen+data+CheckSum我這裏只針對傳輸,你具體的要看你的問題及接收使用的方式 
      

  5.   

    INDY也会粘包,处理好了也没关系,因为TCP会自己来处理丢包和排序,一般会在数据包里加上包的长度与边界符
      

  6.   


      PuserInfo=^TuserInfo;
      TuserInfo=packed record
        A:Array[0..3] of Char;
        B:TDateTime;
        C:Integer;
        D:Array[0..3] of Char;
      end;
      
      TUserPack=packed record
        PackType:Integer;
        DataSize:Integer;
        Data:TuserInfo;
      end;
      
      
    function SendUserInfo(Value:TuserInfo):Integer;
    var
      UserPack:TUserPack;
    begin
      UserPack.PackType:=1234; //每个类型的包的类型编号是唯一的
      UserPack.DataSize:=SizeOf(TuserInfo);
      UserPack.Data:=Value;
      //添加到发送缓冲区
    end;//收到数据后根据 PackType和 DataSize来确定数据包的大小。
      

  7.   

    一是对于发送方引起的粘包现象,用户可通过编程设置来避免,TCP提供了强制数据立即传送的操作指令push,TCP软件收到该操作指令后,就立即将本段数据发送出去,而不必等待发送缓冲区满;二是对于接收方引起的粘包,则可通过优化程序设计、精简接收进程工作量、提高接收进程优先级等措施,使其及时接收数据,从而尽量避免出现粘包现象;三是由接收方控制,将一包数据按结构字段,人为控制分多次接收,然后合并,通过这种手段来避免粘包。不是所有的粘包现象都需要处理,若传输的数据为不带结构的连续流数据(如文件传输),则不必把粘连的包分开(简称分包)。但在实际工程应用中,传输的数据一般为带结构的数据,这时就需要做分包处理。
      

  8.   

    一是对于发送方引起的粘包现象,用户可通过编程设置来避免,TCP提供了强制数据立即传送的操作指令push,TCP软件收到该操作指令后,就立即将本段数据发送出去,而不必等待发送缓冲区满; 
    //WriteBuffer方法的第三个参数为True则会立即发送
      

  9.   

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