Indy 10 TIdUDPclient-检测到错误/没有答案

问题描述 投票:0回答:1

使用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。

indy10 udpclient delphi-10.3-rio jedi
1个回答
0
投票

我想知道在发送UDP数据包后Xms之后客户端是否没有响应

ReceiveBuffer()返回实际接收的字节数。如果在指定的超时时间内未收到任何数据包,则ReceiveBuffer()将返回0。

我希望能够检查发件人地址是否为所需的客户端IP。

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

请注意,UDP具有0字节数据报的概念。 ReceiveBuffer()也将为此返回0。如果返回0,则可以根据需要使用此输出字符串来区分未接收到数据包(VPeerIP = '')与接收到0字节数据包(VPeerIP <> '')。

© www.soinside.com 2019 - 2024. All rights reserved.