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