Использование 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 или что-то подобное.
Я хочу быть в состоянии сказать, не отвечает ли клиент после Xms после того, как я отправил UDP-пакет, и я хочу иметь возможность проверить, является ли адрес отправителя требуемым IP-адресом клиента.