Indy 10 TIdUDPclient - 检测 wrong/no 答案

Indy 10 TIdUDPclient - detect wrong/no Answer

使用 delphi 10.3 和 JEDI VCL。 我与响应 UDP 数据的设备进行通信。 现在我希望能够检查我是否从正确的设备得到了答案,或者我是否得到了任何答案。

目前我使用的是:

function TDIB.ReadData(ACommandCode: WORD; ASendLength : Cardinal; AReceiveLength : Cardinal; AAddress : Cardinal) : Integer;
var
  cmdHeader   : PDIBCommandHeader;
  UDPSend, UDPRecv    : TIdBytes;
  client              : TIdUDPClient;
begin
gRequestPending := TRUE;

// Reserviere Speicher
SetLength(UDPSend, SIzeOF(TDIBCommandHeader) + Cardinal(ASendLength));
SetLength(UDPRecv, SIzeOF(TDIBCommandHeader) + Cardinal(AReceiveLength));
cmdHeader := @UDPSend[0];
cmdHeader.Init(WORD(ACommandCode), AAddress, MAX(ASendLength, AReceiveLength));
client        := TIdUDPClient.Create();
try      
  client.Host   := ValToIPv4(gDIBAddress);
  client.Port   := TDIBPorts.mainPort;
  client.Active           := TRUE;


  client.sendBuffer       (UDPSend);
  client.ReceiveBuffer(UDPRecv,TDIB.C_CMDTimeout);
except
  on E: Exception do

  begin
    ShowMessage('Exception');
    client.Free;
  end;
end;

SetLength(lastUDPData, Length(UDPRecv));
move (UDPRecv[0],lastUDPData[0],Length(UDPRecv));

client.Free;
gRequestPending := FALSE;
end;

当客户端响应时这很好,但我没有发现任何不当行为,例如当主机尝试连接客户端但客户端没有响应时。

在 Indy10 的文档中,我遗漏了 TIdUDPClient.TimedOut 之类的内容。

我想知道,如果客户端在我发送 UDP 数据包后 Xms 后没有响应,我想能够检查发件人地址是否是想要的客户端 IP。

I want to be able to tell, if the client is not responding after Xms after I sent the UDP packet

ReceiveBuffer() returns 实际收到的字节数。如果在指定的超时时间内没有收到数据包,ReceiveBuffer() 将 return 0.

I want to be able to check, if the sender address is the wanted client IP.

使用具有 VPeerIP 输出参数的 ReceiveBuffer() 重载之一。如果收到数据包,它将为您提供发件人 IP,如果没有收到数据包,它将为您提供一个空字符串。

请注意 UDP 具有 0 字节数据报的概念。 ReceiveBuffer() 也将 return 0。在 0 被 returned 的情况下,如果需要,您可以使用此输出字符串区分未收到数据包 (VPeerIP = '') 和收到 0 字节数据包 (VPeerIP <> '')。