我只是在尝试验证IP地址和端口是否可用。 TIdTCPClient.Connect(HOST,PORT)如果成功,则应验证IP地址和端口是否可用(根据我的阅读)。不会,一旦执行了Connect,我的应用程序就会突然终止。
在Parallels Mojave VM上使用Lazarus 2.0.0RC3。连接位于从简单测试应用程序调用的DYLIB中。在DYLIB中,在尝试进行REST调用之前,我先验证了IP地址和端口(这是我唯一要做的事情)。如果我忽略对TIdTCPClient.connect的调用,则REST调用成功(因为我知道IP地址和端口都是正确的,所以服务器就在我旁边)。但是,为了使这些代码疯狂,我想要一种方法来验证服务器(IP地址/端口)是否可用,如果没有,则传回错误。
我尝试使用IP地址,有效的URL(例如Google.com)和简单的端口(例如端口50)。如果我不提供端口,则会出现错误:“需要端口”。
我已经使用TIdTCPClient属性设置了IP地址和端口,并将它们作为参数传递给Connect方法,所有结果都相同(灾难性)。
function IsInternetConnected: boolean;
var
IdTCPClient1: TIdTCPClient;
begin
(*
Result := True;
Exit;
*)
// Verify internet available
Writelog('DEBUG', 'Enter IsInternetConnected');
Result := False;
try
try
IdTCPClient1 := TIdTCPClient.Create;
IdTCPClient1.ReadTimeout := 2000;
IdTCPClient1.ConnectTimeout := 2000;
IdTCPClient1.Host := 'xxx.xxx.xx.xx'; // This is a valid IP address
IdTCPClient1.Port := xxxx; // This is a valid port address
showmessage('B4 Connect');
//IdTCPClient1.Connect(HOST_NAME, HOST_PORT); // SAME RESULT AS SETTING PROPERTIES
// THE FOLLOWING LINE CAUSES AN AV, KILLS THE APPLICATION
IdTCPClient1.Connect;
showmessage('After Connect'); // NEVER GETS HERE
IdTCPClient1.Disconnect;
Result := True;
except
on E: Exception do
begin
showmessage('ERROR Failed to verify internet connection: ' + E.Message);
Writelog('ERROR', 'Failed to verify internet connection: ' + E.Message);
Result := False;
end;
end;
finally
if Assigned(IdTCPClient1) then
FreeandNil(IdTCPClient1);
Writelog('DEBUG', 'Exit IsInternetConnected');
end;
end;
如果IP /端口组合正确,我应该得到TRUE的结果,否则,我应该得到False的结果。
我实际上登录到主机应用程序的日志是DYLIB(和AV)返回了一个错误,然后它为调用例程执行了finally块,并立即执行了主机程序的完成部分。它突然终止。
它应该简单地返回一个响应,说呼叫失败,以及原因(没有互联网连接)。