Delphi - 为什么udp数据包不一样?
Delphi - Why udp data packet is different?
我想了解为什么 Wireshark
程序接收到的数据包与我的 delphi 应用程序发送的数据包不同。谁能帮帮我?
这是我的代码:
if Pos('\x',comandoRede.Comando) > 0 then
begin
bufferS := Explode('\x',comandoRede.Comando);
SetLength(buffer,Length(bufferS)-1);
for J := 0 to Length(Buffer) -1 do
begin
buffer[J] := StrToInt('$'+bufferS[J+1]);
end;
TIdUDPServer(item).SendBuffer(equipamentoRede.IP,
StrToInt(equipamentoRede.Port),buffer,Length(buffer));
end
这里是缓冲区数组的内容:
这里是network sniffer Wireshark
的日志
我也试过 TIDUDPClient,但问题是一样的。
感谢所有帮助。
Indy 9中,SendBuffer()
声明如下:
procedure SendBuffer(AHost: string; const APort: Integer; var ABuffer; const AByteCount: integer);
请注意 ABuffer
是一个未类型化的 var
。这意味着你可以向它传递 任何东西,它会接收你传入的任何变量的内存地址。
您的 buffer
被声明为动态数组(可能是由于您使用了 SetLength()
)。动态数组在内部实现为指向驻留在内存中其他位置的内存块的指针。当您将动态数组变量传递给无类型 var
参数时,参数接收变量本身的内存地址,而不是变量指向的数组数据的内存地址。这就是为什么您看到 "garbage" 在套接字上发送的原因 - 您实际上是在发送数据指针本身的字节!您的代码 碰巧 不会崩溃,因为您的 buffer
长度为 4 并且 Delphi 7 中的指针大小为 4 个字节。
为了让var
参数接收实际数组数据的内存地址,您必须:
数组第一个元素的索引:
TIdUDPServer(item).SendBuffer(..., buffer[0], Length(buffer));
将数组变量类型转换为适当的指针类型(在这种情况下,大概 buffer
是一个 array of Byte
,所以使用 PByte
),然后取消引用指针:
TIdUDPServer(item).SendBuffer(..., PByte(buffer)^, Length(buffer));
我想了解为什么 Wireshark
程序接收到的数据包与我的 delphi 应用程序发送的数据包不同。谁能帮帮我?
这是我的代码:
if Pos('\x',comandoRede.Comando) > 0 then
begin
bufferS := Explode('\x',comandoRede.Comando);
SetLength(buffer,Length(bufferS)-1);
for J := 0 to Length(Buffer) -1 do
begin
buffer[J] := StrToInt('$'+bufferS[J+1]);
end;
TIdUDPServer(item).SendBuffer(equipamentoRede.IP,
StrToInt(equipamentoRede.Port),buffer,Length(buffer));
end
这里是缓冲区数组的内容:
这里是network sniffer Wireshark
我也试过 TIDUDPClient,但问题是一样的。
感谢所有帮助。
Indy 9中,SendBuffer()
声明如下:
procedure SendBuffer(AHost: string; const APort: Integer; var ABuffer; const AByteCount: integer);
请注意 ABuffer
是一个未类型化的 var
。这意味着你可以向它传递 任何东西,它会接收你传入的任何变量的内存地址。
您的 buffer
被声明为动态数组(可能是由于您使用了 SetLength()
)。动态数组在内部实现为指向驻留在内存中其他位置的内存块的指针。当您将动态数组变量传递给无类型 var
参数时,参数接收变量本身的内存地址,而不是变量指向的数组数据的内存地址。这就是为什么您看到 "garbage" 在套接字上发送的原因 - 您实际上是在发送数据指针本身的字节!您的代码 碰巧 不会崩溃,因为您的 buffer
长度为 4 并且 Delphi 7 中的指针大小为 4 个字节。
为了让var
参数接收实际数组数据的内存地址,您必须:
数组第一个元素的索引:
TIdUDPServer(item).SendBuffer(..., buffer[0], Length(buffer));
将数组变量类型转换为适当的指针类型(在这种情况下,大概
buffer
是一个array of Byte
,所以使用PByte
),然后取消引用指针:TIdUDPServer(item).SendBuffer(..., PByte(buffer)^, Length(buffer));