INDY 10 TIdTCPClient.Connect导致访问冲突

时间:2019-06-06 02:27:42

标签: lazarus freepascal indy10

我只是在尝试验证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块,并立即执行了主机程序的完成部分。它突然终止。

它应该简单地返回一个响应,说呼叫失败,以及原因(没有互联网连接)。

0 个答案:

没有答案