本人的一个程序是从server端不断接收数据,可是发现接收来的数据不全,请问如何解决这个"丢包"的问题呢,
还有blocking 和nonBlocking 两种模式到底有何区别呢

解决方案 »

  1.   


    或许说的不是太明白吧, 我再补充一点,  我用的procedure TMyThread.Execute;
    begin
     while (not terminated) do
          Synchronize(invoke);
    end;procedure TMyThread.invoke;
    var
      buf:array [0..511]of char;
    begin
         with form1 do begin
           TcpClient1.ReceiveBuf(buf,500,0);
           StringGrid1.Rows[Form1.StringGrid1.RowCount-1].Add(intToStr(i));
           StringGrid1.Rows[Form1.StringGrid1.RowCount-1].Add(buf);
           label6.Caption:='Now Receive '+intToStr(i)+ ' message';
           StringGrid1.RowCount:=StringGrid1.RowCount+1;
           inc(i);
        end;
    end;
    end.
    这里我没有设置使用哪种模式.
      

  2.   

    TCP正常情况下不会丢包,丢包都是错误的程序设计的结果
      

  3.   

    我也认为不会丢失,我现在用的都是 TIdTCPClient  procedure ReadBuffer(var ABuffer; const AByteCount: Longint);
      

  4.   

    通常情况下socket的缓冲为2K,在超过2K时会有数据丢失。
      

  5.   

    同意syl79(),不过有的控件已经间接解决了这个问题,可以把缓冲设得更大,比如Indy。可以使用滑动窗口,来控制发送流量。就是说,对方未应答的数据包,应控制在一定的数量内。等对方应答后,再发送后继数据包。可降低丢包概率。或只管发,直到对方应答。就像QQ的UDP协议一样。不管丢不丢包。有应答,就确定对方已收到,没应答,就认为没收到。
      

  6.   

    另外,在大数据量的时候,接收后,不要在接收过程中对窗体界面进行过多的操作。
    可尝试把以下句改进一下
    改为内存操作,再映射到窗体界面上。       
           StringGrid1.Rows[Form1.StringGrid1.RowCount-1].Add(intToStr(i));
           StringGrid1.Rows[Form1.StringGrid1.RowCount-1].Add(buf);
           label6.Caption:='Now Receive '+intToStr(i)+ ' message';
           StringGrid1.RowCount:=StringGrid1.RowCount+1;
      

  7.   

    genbin(蓝丐) 另外,在大数据量的时候,接收后,不要在接收过程中对窗体界面进行过多的操作。
    可尝试把以下句改进一下
    改为内存操作,再映射到窗体界面上。       
            你说"改为内存操作那如何改呢",望答.谢谢
      

  8.   

    通常情况下socket的缓冲为2K,在超过2K时会有数据丢失。?
    Tcp协议超过2K时也不会丢的,除非程序写的有问题