我用delphi7做的UDP通讯,代码如下:
发送端用IdUDPClient,代码如下:
procedure SendInformation(DataByte:TArrayType);
var len,i:integer;
    lsSendBuff: array[0..39] of byte;
begin
   len:=High(DataByte)+1;
   for i:=0 to len-1 do lsSendBuff[i]:=DataByte[i];
   FormMain.IdUDPClient1.SendBuffer(lsSendBuff,len);
End;
接收端用IdUDPServer,代码如下:
procedure TFormMain.IdUDPServer1UDPRead(Sender: TObject; AData:TStream;
  ABinding: TIdSocketHandle);
var
  lsRevBuff:array[0..39] of byte;
  Len: integer;
begin
  //从流中读取数据到临时缓冲区
  Len:=AData.Size;
  if len<>40 then exit;
  AData.ReadBuffer(lsRevBuff,Len);
end;
如果按上述方法发送能正确接收,如果将发送端改成下列代码,接收端就不能正确接收,请指点,谢谢!
procedure SendInformation(DataByte:TArrayType);
var len:integer;
begin
   len:=High(DataByte)+1;
   FormMain.IdUDPClient1.SendBuffer(DataByte,len);
End;

解决方案 »

  1.   

          len:=High(DataByte)+1;
          FormMain.IdUDPClient1.SendBuffer(DataByte,len); 
    DataByte的数据呢
      

  2.   

    brightyang
    首先感谢你!DataByte的类型为:
    type
        TArrayType=array of Byte;SetLength(DataByte,40);
    它作为一个参数,长度为40,调用SendInformation(DataByte:TArrayType之前已为它的每个单元赋值。
    如果将DataByte定义为:DataByte:Array[0..40) Of Byte,收发的数据才一样。
      

  3.   

    请问你用的INDY的版本是多少??不同的版本的SendBuffer的参数类型是不一样的.
    或者你直接贴出SendBuffer的定义.
      

  4.   

    发送端用IdUDPClient,代码如下: 
    procedure SendInformation(DataByte:TArrayType); 
    var len,i:integer; 
        lsSendBuff: array[0..39] of byte; 
    begin 
       len:=High(DataByte)+1; //这一句是多余的。
       for i:=0 to high(DataByte){len-1} do 
         lsSendBuff[i]:=DataByte[i]; 
       FormMain.IdUDPClient1.SendBuffer(lsSendBuff,len); 
    End;
      IdUDPClient1.SendBuffer(var abuffer;const abyteCount:integer);
    自己仔细看看为个发送方法的原型吧。
    第一个参数是一个引用类型的无类型参数,也就是说是一个引用类型的指针;
    procedure SendInformation(DataByte:TArrayType); 
    var len:integer; 
    begin 
       len:=High(DataByte)+1; 
       FormMain.IdUDPClient1.SendBuffer(DataByte,len); 
    End;
    在这个方法中,DataByte是一个“常参”也就是说,他是一个无法改变的指针,你以这种方式发送数据,能发成功?
    编译器应当提示数据类型不正确才是啊。
    就算你这样发送可以操作,你也无法发送LEN个字节,最多也就发送了一个字节而已,这条指令对于你的系统来说,就是
    非法指令,能有回应么?
     
      

  5.   

    试试这样写
    procedure SendInformation(DataByte:TArrayType);  
    var len:integer;  
    begin  
       len:=High(DataByte)+1;  
       FormMain.IdUDPClient1.SendBuffer(DataByte[0],len);  
    End;