Indy 10 TIdUDPclient - определить неправильно / нет ответа - PullRequest
0 голосов
/ 05 марта 2020

Использование 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-адресом клиента.

1 Ответ

1 голос
/ 05 марта 2020

Я хочу быть в состоянии сказать, не отвечает ли клиент после Xms после того, как я отправил пакет UDP.

ReceiveBuffer() возвращает количество фактически полученных байтов. Если в течение указанного времени не получен пакет, ReceiveBuffer() вернет 0.

Я хочу иметь возможность проверить, является ли адрес отправителя требуемым IP-адресом клиента.

Используйте одну из перегрузок ReceiveBuffer() с выходным параметром VPeerIP. Это даст вам IP-адрес отправителя, если пакет получен, или пустую строку, если пакет не получен.

Имейте в виду, что UDP имеет концепцию 0-байтовой дейтаграммы. ReceiveBuffer() также вернет 0 для этого. В случае, если возвращается 0, вы можете использовать эту выходную строку, чтобы различать между полученным пакетом (VPeerIP = '') и полученным 0-байтовым пакетом (VPeerIP <> ''), если необходимо.

...