本人将代码从Indy9迁升到Indy10,但是在TIdUDPClient的ReceiveBuffer方法上报错(Range Check Error),请问大家是否也遇到这样的问题,有无解决办法?

解决方案 »

  1.   

    把你的代码贴出来,我用ReceiveBuffer没有出现问题。
      

  2.   

    测试代码很简单:
    客户端按钮事件,点击后发送消息给服务器端,然后等待接收数据,服务器端可成功接收,但是客户端接收报错。
    procedure TFrm_Client.Button1Click(Sender: TObject);
    var
      _AData: TBytes;
    begin
      uc.Send('Test!');
      uc.ReceiveBuffer(_AData);
    end;服务器端将接收到的数据再返回给客户端。(AData换成其他TBytes类型的变量后客户端仍然接收报错,除非把AData改为nil,客户端才不报错。)
    procedure TFrm_Server.usUDPRead(AThread: TIdUDPListenerThread;
      AData: TBytes; ABinding: TIdSocketHandle);
    begin
      Abinding.SendTo(Abinding.PeerIP, Abinding.PeerPort, AData);
    end;测试环境Win7 + Delphi2010 + Indy10.5.5,我在Win7 + Delphi2007 + Indy10.1.5以及WinXP +Delphi2010 + Indy10.5.5下测试问题依旧,不明白为何引起“Range Check Error”错误。
      

  3.   

    在发送SOCKET和接受SOCKET都需要判断接收和发送多长字节,你就uc.ReceiveBuffer(_AData);是有问题的。
      

  4.   

    接收之前先绑定端口
    uc.BoundPort := 9999;
      

  5.   

    SetLength(_AData,5000);  //长度随参数的变化而变化
    datalenth:=uc.ReceiveBuffer(_AData);
    //datalenth就是_AData实际收到的长度。
    tmpstr:='';
      for I := 0 to length(_AData) - 1 do
      begin
        tmpstr:=tmpstr+char(strtoint(inttostr(StrToInt64('$'+inttohex(_AData[I],2)))));
      end;