Я просто пытаюсь проверить, что IP-адрес и порт доступны.TIdTCPClient.Connect (HOST, PORT) в случае успеха должен убедиться, что IP-адрес и порт доступны (согласно моим прочтениям).Это не так, как только выполняется Connect, мое приложение внезапно завершается.
Использование Lazarus 2.0.0RC3 на виртуальной машине Parallels Mojave.Connect находится в DYLIB, вызываемом из простого тестового приложения.В DYLIB перед попыткой вызова REST я проверяю IP-адрес и порт (это единственное, что я пытаюсь сделать).Если я игнорирую вызов TIdTCPClient.connect, вызов REST завершается успешно (поскольку я знаю, что IP-адрес правильный, как и порт, рядом со мной сидит сервер).НО для помещения этого кода в дикую природу я хотел, чтобы был способ проверить, что сервер (IP-адрес / Порт) был доступен и передать ошибку, если нет.
Я попытался использовать IP-адрес, действительный URL(например, Google.com) и простой порт, например, порт 50. Если я не предоставляю порт, я получаю сообщение об ошибке: «Требуется порт».
Я установил IP-адрес и порт с помощью TIdTCPClientсвойства, передаваемые в качестве параметров методу 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;
Я должен получить либо результат TRUE, если комбинация IP / порт верна, либо False, если неверен или нетв этом смысл упражнения.
То, что я на самом деле регистрирую в журнале хост-приложения, - это то, что из DYLIB (и AV) возвращается ошибка, затем он выполняет блок finally для вызывающей подпрограммы и немедленно выполняет раздел финализации программы хоста.т.е.он прерывается внезапно.
Он должен просто получить ответ, чтобы сказать, что вызов был неудачным и почему (без подключения к интернету).