LeftSize := ScrStream.Size;//数据包的大小 //剩余部分大于一个包时
 while LeftSize>512 do
  begin
   ScrStream.ReadBuffer(Buff,512);
   NMUDP2.SendBuffer(Buff,512); { 将数据发到主控机}
   LeftSize:=LeftSize-512;
 end;  ScrStream.ReadBuffer(LeftSize,512);
  NMUDP2.SendBuffer(LeftSize,512); { 将数据发到主控机}只要数据包大小大于8192字节,机会出现超出部分根本接受不到的问题。
请那位朋友执教一下。如何解决这个问题!

解决方案 »

  1.   

    udp发包地大小本来就是有限制地
    好像是8k,记不清楚了
      

  2.   

    因为UDP缓冲区只有8192字节,你分割发包时,最好取得对方的确认包(直接编否则用IdUDPClient),否则你这样在对方计算机和网络不快时,很容易缓冲溢出而丢包
      

  3.   

    用UDP是因为对实时性要求较高,对可靠性要求不太高。
    如果这样,带宽消耗较大,那其不如用TCP
      

  4.   

    修改一下你的代码,如果成功给我加分!!:-)
    LeftSize := ScrStream.Size;//数据包的大小 //剩余部分大于一个包时
     while LeftSize>512 do
      begin
       ScrStream.ReadBuffer(Buff,512);
       NMUDP2.SendBuffer(Buff,512); { 将数据发到主控机}
       LeftSize:=LeftSize-512;
        //在这里加一句就可以了
       Application.ProcessMessages;
     end;
      

  5.   

    加了Application.ProcessMessages还是不行。我是在单机上进行试验了多种方法.
    1>用2个NMUDP,一个发送,一个接收;没有使用多线程
    2>用 IdUDPClient1: TIdUDPClient;
        IdUDPServer1: TIdUDPServer;
    并且(1)不改变默认缓冲大小试验
        (2)多次改变缓冲区大小试验
    结果还是不行
    3>利用第三方的UDP控件包BufferUDP,结果还是一样只要一次传送数据大于8192字节(进行了分包发送,包的大小为512),就会出现超出部分根本接受不到.我的开发环境为win2000, delphi6.0
    系统管理员权限。
      

  6.   

    我试验时,大于8192 也有问题,但假如加上Application.ProcessMessages就可以了
      

  7.   

    To errorcode:
    你能把你的处理部分贴出来吗? 谢谢
      

  8.   

    //Write By Delphi5
    //--------------------------------unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls, NMUDP;type
      TForm1 = class(TForm)
        UDP1: TNMUDP;
        Button1: TButton;
        Button2: TButton;
        procedure Button1Click(Sender: TObject);
        procedure UDP1DataReceived(Sender: TComponent; NumberBytes: Integer;
          FromIP: String; Port: Integer);
        procedure FormShow(Sender: TObject);
        procedure Button2Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;
      Count: Integer;
      AllStr: String;implementation{$R *.DFM}procedure TForm1.Button1Click(Sender: TObject);
    var
        PStr1: Array [0..512] of char;
        i, j: Integer;
    begin
        FillChar(PStr1, 513, 0);
        for i:= 0 to 511 do PStr1[i]:= '1';
        for i:= 0 to 20 do
        begin
            UDP1.SendBuffer(PStr1, 512);
            Application.ProcessMessages;
        end;
    end;procedure TForm1.UDP1DataReceived(Sender: TComponent; NumberBytes: Integer;
      FromIP: String; Port: Integer);
    Var
        pp: Array [0..512] of char;
        i: Integer;
    begin
       Count:= Count + 1;
       UDP1.ReadBuffer(pp, i);
       AllStr:= AllStr + StrPas(pp);end;procedure TForm1.FormShow(Sender: TObject);
    begin
        Count:= 0;
        AllStr:= '';
    end;procedure TForm1.Button2Click(Sender: TObject);
    begin
        showmessage(IntToStr(Length(AllStr))+ '<>' + IntToStr(Count));
    end;end.
      

  9.   

    我也遇到udp传输的问题了```我每次发送2048个字节,然后组包`````可是接收到的文件有时打不开````格式被破坏```时好时坏的```我正纳闷呢```有高手知道如何解决吗?谁有好的文件传输例子发给我可以吗?[email protected]  谢谢
      

  10.   

    SOCKET默认的缓冲区大小为8192,因此发送数据的速率大快的话,当发送的字节数大于8192时会出现少包的现象,
    可以通过延时的方法,即在每次发送完后Sleep一段时间。或在OnDataSend事件中调用发送
      

  11.   

    赞同lichungen(阿根) ,我做过类似东东,确如lichungen(阿根) 所言。
      

  12.   

    但是传输的数据较多,网络带宽够用。
    如果利用Sleep的话,就没法充分利用UDP速度快优势呀!