使用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。
我想知道在发送UDP数据包后Xms之后客户端是否没有响应
ReceiveBuffer()
返回实际接收的字节数。如果在指定的超时时间内未收到任何数据包,则ReceiveBuffer()
将返回0。
我希望能够检查发件人地址是否为所需的客户端IP。
使用具有ReceiveBuffer()
输出参数的VPeerIP
重载之一。如果收到数据包,将为您提供发送方IP;如果没有收到数据包,则将为您提供一个空字符串。
请注意,UDP具有0字节数据报的概念。 ReceiveBuffer()
也将为此返回0。如果返回0,则可以根据需要使用此输出字符串来区分未接收到数据包(VPeerIP = ''
)与接收到0字节数据包(VPeerIP <> ''
)。