delphi - 如何读取/写入记录类型以通过 udp 发送它们?

标签 delphi record

我有一个 record type,其中包含名称、登录名、外部 IP、标签和一个 bool 值。我想通过 UDP 将该信息发送到其他计算机,我想将其返回到相同记录类型的变量中。

我已经知道如何使用 Indy 的 UDPClient/UDPServer 发送和接收简单的字符串。

但是如何发送记录数据呢?

如果可能的话,我还想将此数据传递给我的加密方法 codeSSL(s,k) 并在收到时传递给 decodeSSL(s,k)但如果你能回答我的第一个问题,我会很满意,这个问题更重要。

最佳答案

在发送方,您需要将记录数据序列化为平面字节数组,可选择加密这些字节,然后发送它们。在接收方,您将读取字节,可选择对其进行解密,然后将它们序列化回记录中。 TIdUDPClientTIdUDPServer 有读取/写入 TIdBytes 数据的方法,IdGlobal 单元有操作 的函数>TIdBytes 数据。

例如:

发件人:

type
  TMyRecord = record
    Name: String;
    Login: String;
    ExternalIP: String;
    Tags: String;
    Flag: Boolean;
  end;

procedure AppendStringToBuffer(var Bytes: TIdBytes; const S: String);
var
  Tmp: TIdBytes;
  Len: Byte;
begin
  Tmp := ToBytes(S, enUTF8);
  Len := Length(Tmp);
  AppendByte(Bytes, Len);
  AppendBytes(Bytes, Tmp);
 end;

var
  Rec: TMyRecord;
  Buf: TIdBytes;
begin
  Rec := ...;

  AppendStringToBuffer(Buf, Rec.Name);
  AppendStringToBuffer(Buf, Rec.Login);
  AppendStringToBuffer(Buf, Rec.ExternalIP);
  AppendStringToBuffer(Buf, Rec.Tags);
  AppendByte(Buf, Ord(Rec.Flag));

  // optionally encrypt the buffer...

  MySocket.SendBuffer(TargetHost, TargetPort, Buf);
end;

接收者:

type
  TMyRecord = record
    Name: String;
    Login: String;
    ExternalIP: String;
    Tags: String;
    Flag: Boolean;
  end;

function ReadStringFromBuffer(const Bytes: TIdBytes; var Index: Integer): String;
var
  Len: Integer;
begin
  Len := Bytes[Index];
  Inc(Index);
  if Len > 0 then
  begin
    Result := BytesToString(Bytes, Index, Len, enUTF8);
    Inc(Index, Len);
  end else
    Result := '';
 end;

var
  Rec: TMyRecord;
  Buf: TIdBytes;
  BufLen, Index: Integer;
  SenderIP: String;
  SenderPort: TIdPort;
begin
  SetLength(Buf, 1025);
  BufLen := MySocket.ReceiveBuffer(Buf, SenderIP, SenderPort);
  if Buf <= 0 then Exit;

  // optionally decrypt the buffer...

  Index := 0;
  Rec.Name := ReadStringFromBuffer(Buf, Index);
  Rec.Login := ReadStringFromBuffer(Buf, Index);
  Rec.ExternalIP := ReadStringFromBuffer(Buf, Index);
  Rec.Tags := ReadStringFromBuffer(Buf, Index);
  Rec.Flag := Buf[Index] <> $00;

  ...
end;

关于delphi - 如何读取/写入记录类型以通过 udp 发送它们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24110501/

相关文章:

delphi - 按标题搜索标签

Delphi:从启用代理的 Windows7 PC 访问 SOAP 服务器时出现访问冲突错误,并且 SOAP 服务器挂起

iphone - 使用phonegap在iPhone上录制音频

record - 如何找出 JOOQ 记录包含一些值

delphi - 了解代码是使用 Lazarus 还是 Delphi 编译的

multithreading - TThread.Execute没有按预期方式被调用

将 C 代码转换为 Delphi

Mysql设置一条记录为删除或归档

java - 在 java 中录制流式音频?

lambda - 以标签作为参数的 F# 函数