INDY 10 TIdTCPClient.Connect вызывает нарушение прав доступа - PullRequest
0 голосов
/ 06 июня 2019

Я просто пытаюсь проверить, что 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 для вызывающей подпрограммы и немедленно выполняет раздел финализации программы хоста.т.е.он прерывается внезапно.

Он должен просто получить ответ, чтобы сказать, что вызов был неудачным и почему (без подключения к интернету).

...