繁体   English   中英

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的日志

Wireshark的

我也尝试过使用TIDUDPClient,但是问题是相同的。

感谢所有帮助。

在Indy 9中, SendBuffer()声明如下:

procedure SendBuffer(AHost: string; const APort: Integer; var ABuffer; const AByteCount: integer);

请注意, ABuffer是无类型的var 这意味着您可以将任何内容传递给它,并且它接收您传递的任何变量的内存地址。

您的buffer被声明为动态数组(大概是由于您使用SetLength() )。 动态数组在内部实现为指向驻留在内存中其他位置的内存块的指针。 当您将动态数组变量传递给无类型的var参数时,该参数将接收变量本身的内存地址,而不是该变量所指向的数组数据的内存地址。 这就是为什么您在套接字上看到“垃圾”的原因-实际上是在发送数据指针本身的字节! 您的代码碰巧不会崩溃,因为您的buffer长度为4,而Delphi 7中的指针的大小为4个字节。

为了使var参数接收实际数组数据的内存地址,您必须:

  1. 索引到数组的第一个元素:

     TIdUDPServer(item).SendBuffer(..., buffer[0], Length(buffer)); 
  2. 将数组变量类型转换为适当的指针类型(在这种情况下, buffer可能是array of Bytearray of Byte ,因此请使用PByte ),然后取消引用指针:

     TIdUDPServer(item).SendBuffer(..., PByte(buffer)^, Length(buffer)); 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM