【问题标题】:IdUDPClient , how to send a packet to server?IdUDPClient ,如何向服务器发送数据包?
【发布时间】:2012-11-21 21:07:30
【问题描述】:

如何正确地将数据包发送到 UDP 服务器?我正在尝试,但它不起作用,因为我没有从服务器收到任何东西。

我需要的是发送一个数据包:int64|int|int

并从服务器接收一个数据包:int|int|int64

如何正确操作?谢谢。

type
  Tconnecting = record
    a: int64;
    b: integer;
    c: integer;
  end;
  Treply_connect = record
    a: integer;
    b: integer;
    c: int64;
  end;

var 
  udp: TIdUDPClient;
  send_data: TIdBytes;
  received_data: TIdBytes;
  i: integer;
  packet: Tconnecting;
  reply_packet: Treply_connect;

begin
  packet.a := 41727101980;
  packet.b := 0;
  packet.c := RandomRange(1, 9999999);
  SetLength(send_data, sizeof(packet));
  Move(packet, send_data[0], sizeof(packet));
  udp := TIdUDPClient.Create(nil);
  try
    udp.Host := 'server.com';
    udp.Port := 1234;
    udp.SendBuffer(send_data);
    SetLength(received_data, 0);
    i := udp.ReceiveBuffer(received_data, 5000);
    Memo1.Lines.Add('Data reiceived! Len:'+IntToStr(Length(received_data))+',data:|'+BytesToString(received_data, 0)+'|');
  finally
    FreeAndNil(udp);
  end;

【问题讨论】:

    标签: delphi indy10 delphi-xe3


    【解决方案1】:

    您没有正确使用ReceiveBuffer()。您将输出缓冲区的大小设置为 0 字节,因此 ReceiveBuffer() 将没有任何内存来读取接收到的数据。您需要将输出缓冲区预分配到您期望的最大大小。 ReceiveBuffer() 的返回值将告诉您实际读入缓冲区的字节数。

    换句话说,改变这个:

    SetLength(received_data, 0);
    

    到这里:

    SetLength(received_data, SizeOf(Treply_connect));
    

    然后改变这个:

    Memo1.Lines.Add('Data reiceived! Len:'+IntToStr(Length(received_data))+', data:|'+BytesToString(received_data, 0)+'|');
    

    到这里:

    Memo1.Lines.Add('Data received! Len:'+IntToStr(i)+', data:|'+BytesToString(received_data, 0, i)+'|');
    

    另外,Indy 有一个 RawToBytes() 函数,您可以使用该函数将您的数据包复制到 TIdBytes

    send_data := RawToBytes(packet, SizeOf(packet));
    

    还有一个BytesToRaw() 函数,用于提取接收到的数据包:

    BytesToRaw(received_data, reply_packet, SizeOf(reply_packet));
    

    【讨论】:

      猜你喜欢
      • 2017-07-21
      • 1970-01-01
      • 1970-01-01
      • 2010-12-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多