我有一个 record
type
,其中包含名称、登录名、外部 IP、标签和一个 bool 值。我想通过 UDP
将该信息发送到其他计算机,我想将其返回到相同记录类型的变量中。
我已经知道如何使用 Indy 的 UDPClient/UDPServer 发送和接收简单的字符串。
但是如何发送记录数据呢?
如果可能的话,我还想将此数据传递给我的加密方法 codeSSL(s,k)
并在收到时传递给 decodeSSL(s,k)
但如果你能回答我的第一个问题,我会很满意,这个问题更重要。
最佳答案
在发送方,您需要将记录数据序列化为平面字节数组,可选择加密这些字节,然后发送它们。在接收方,您将读取字节,可选择对其进行解密,然后将它们序列化回记录中。 TIdUDPClient
和 TIdUDPServer
有读取/写入 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/