正确使用IdUDPClient.ReceiveBuffer

Mik*_*keA 0 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;
Run Code Online (Sandbox Code Playgroud)

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

非常感谢所有帮助.

谢谢,

麦克风

Rem*_*eau 5

正如我在评论中告诉你的上一个问题:

你也必须使用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;
Run Code Online (Sandbox Code Playgroud)

由于您的原始缓冲区是一个数组Char,并且您的处理函数已命名ReceivedLine(),因此我假设您的数据本质上是文本的.如果这是真的,你可以使用BytesToString()(T|I)IdTextEncoding.GetString()到转换TIdBytesString,如果这是ReceivedLine()使用myBuf的,例如:

S := BytesToString(myBuf{, en8bit});
Run Code Online (Sandbox Code Playgroud)

S := BytesToString(myBuf, 0, lenUDP{, en8bit});
Run Code Online (Sandbox Code Playgroud)

S := IndyTextEncoding_8bit.GetString(myBuf);
Run Code Online (Sandbox Code Playgroud)

S := IndyTextEncoding_8bit.GetString(myBuf, 0, lenUDP);
Run Code Online (Sandbox Code Playgroud)

可以使用该印地支持任何字符集编码,或者通过各种en...(),Indy...Encoding()IndyTextEncoding...()在功能IdGlobal单元,或者CharsetToEncoding()在功能IdGlobalProtocols单元.

更新:由于您的缓冲区是其中包含union的记录的一部分,因此您必须使用局部TIdBytes变量:

type
  myRecord = record
    ...
    myBuf: array[0..buffLength-1] of Byte;
    ...
  end;

...

private
  myRec: myRecord;

...

var
  udpBuf: TIdBytes;
...
SetLength(udpBuf, buffLength);
while not Terminated do
begin
  try
    lenUDP := IdUDPClient.ReceiveBuffer(udpBuf, -1);
    if lenUDP > 0 then
    begin
      BytesToRaw(udpBuf, myRec.myBuf[0], lenUDP);
      Synchronize(ReceivedLine);
    end;
  except
    Terminate;
  end;
end;
Run Code Online (Sandbox Code Playgroud)