正确使用IdUDPClient.ReceiveBuffer

时间:2014-11-25 21:28:50

标签: delphi indy udpclient

感谢您的帮助。

我正在将旧版本的Delphi转换为XE5,我对Indy组件感到困惑。需要使用IdUDPClient.ReceiveBuffer

这是我的代码:

while not Terminated do
begin
  try
    lenUDP:= IdUDPClient.ReceiveBuffer(myBuf, buffLength, -1 );
    if lenUDP<> 0 then
      Synchronize(ReceivedLine);
  except
    Terminate;
  end;
end;

其中, myBuf = char的数组[0 .. buffLength -1];

非常感谢所有帮助。

谢谢,

麦克

1 个答案:

答案 0 :(得分:5)

正如我在评论中告诉你的previous question

  

你也必须使用TIdBytes。使用SetLength()将其预先分配到所需的大小,然后使用它调用ReceiveBuffer(),然后您可以根据需要直接或使用BytesToRaw()复制数据。

例如:

private
  myBuf: TIdBytes;
...

while not Terminated do
begin
  try
    SetLength(myBuf, buffLength);
    lenUDP := IdUDPClient.ReceiveBuffer(myBuf, -1);
    if lenUDP > 0 then
    begin
      SetLength(myBuf, lenUDP);
      Synchronize(ReceivedLine);
    end;
  except
    Terminate;
  end;
end;

由于您的原始缓冲区是Char的数组,并且您的处理函数名为ReceivedLine(),因此我假设您的数据本质上是文本的。如果是这样,您可以使用BytesToString()(T|I)IdTextEncoding.GetString()TIdBytes转换为String,如果这是ReceivedLine()使用的myBuf {}例如:

S := BytesToString(myBuf{, en8bit});

S := BytesToString(myBuf, 0, lenUDP{, en8bit});

S := IndyTextEncoding_8bit.GetString(myBuf);

S := IndyTextEncoding_8bit.GetString(myBuf, 0, lenUDP);

您可以使用Indy支持的任何字符集编码,通过en...()单元中的各种Indy...Encoding()IndyTextEncoding...()IdGlobal函数,或{{1 {}}}单位中的函数。

UPDATE :由于您的缓冲区是包含联合的记录的一部分,因此您必须使用本地CharsetToEncoding()变量:

IdGlobalProtocols