【问题标题】:AV after TIdHttp.get from an https site从 https 站点获取 TIdHttp.get 之后的 AV
【发布时间】:2019-12-13 13:44:51
【问题描述】:

检查 HTTPS 站点后,我没有收到任何错误,并且可以返回 Internet 连接似乎正常工作,但是当我关闭程序时,我得到了一个 AV。

这是我之前关于检查 Internet 连接是否正常的帖子的后续内容。

我按照建议修改了我的函数,现在检查了几个站点,但是,如果我访问 HTTPS 站点,我的函数可以工作,但是当我关闭程序时,我得到了一个 AV。如果我只访问 HTTP 站点进行测试,则关闭时不会发生 AV。

这是函数的一个片段,我访问的第一个站点是 HTTPS,所以我不需要处理程序,这样更简单。如果我注释掉 HTTPS 并取消注释 HTTP,它可以工作,没有 AV。实际功能测试了几个站点,但这很容易产生错误。

访问 HTTPS 站点时我需要做一些额外的事情吗?

procedure TForm1.btnTestConnectionClick(Sender: TObject); 
var 
  http: TIdHttp; 
  bFound: boolean;
begin 
  bFound := True; 
  http := TIdHttp.Create(nil); 
  try 
    try 
      //http.Get('http://www.google.com'); 
      http.Get('https://www.wikipedia.org'); 
    except 
      bFound := False; 
    end; 
  finally 
    FreeAndNil(http); 
  end; 
  if not bFound then 
    ShowMessage('Internet not working')
  else 
    ShowMessage('Internet working'); 
end;

返回值符合预期,如果我尝试多个站点直到找到一个(表明 Internet 正在运行),它可以工作,但是如果我访问 HTTPS 站点,我会在程序关闭时获得 AV。

【问题讨论】:

  • 您的代码很好,AV 可能与其他内容有关。您需要调试代码并找出根本原因。但是,也就是说,您根本不需要处理 HTTPS 来测试有效连接。实际上,您甚至根本不需要使用 TIdHTTP,仅使用 TIdTCPClient 就足够了。您所需要的只是连接到几台服务器上的给定端口,您不需要实际与它们通信。我在之前的回答中已经告诉过你了
  • 如果您的真正目标是连接到其他网站,那么检查您是否可以连接到 google.com 有什么意义?既然你需要处理你真正的通信代码中的错误,为什么还要浪费时间检查你是否可以连接到其他站点呢?

标签: http indy delphi-xe


【解决方案1】:

您的代码很好,AV 可能与其他内容有关。您需要调试代码并追查根本原因。

但是,也就是说,您根本不需要处理 HTTPS 来测试有效连接。事实上,你甚至根本不需要使用TIdHTTP,单独使用TIdTCPClient 就足够了。你所需要的只是连接到几个服务器上的给定端口,你不需要实际与它们通信(我在my answeryour previous question 中告诉过你很多),例如:

procedure TForm1.btnTestConnectionClick(Sender: TObject); 
const
  Hosts: array[0..1] of string = ('www.google.com', 'www.wikipedia.org'{, ...});
var 
  tcp: TIdTCPClient; 
  host: string;
  bFound: boolean;
begin 
  bFound := False;
  try
    tcp := TIdTCPClient.Create(nil); 
    try 
      for host in Hosts do
      begin
        tcp.Host := host;
        tcp.Port := 80; // or 443...
        try
          tcp.Connect;
        except
          Continue;
        end;
        tcp.Disconnect;
        bFound := True;
        Break;
      end;
    finally 
      tcp.Free; 
    end; 
  except
  end;
  if not bFound then 
    ShowMessage('Internet not working')
  else 
    ShowMessage('Internet working'); 
end;

【讨论】:

  • 感谢您的帮助雷米,非常感谢。我想我在连接到 https 时专注于通过 AV,而不是跳出框框。
猜你喜欢
  • 2012-12-01
  • 1970-01-01
  • 2011-09-01
  • 1970-01-01
  • 2012-04-19
  • 2011-05-29
  • 1970-01-01
  • 1970-01-01
  • 2017-01-22
相关资源
最近更新 更多