【问题标题】:delphi check internet connectiondelphi 检查网络连接
【发布时间】:2014-03-13 19:43:00
【问题描述】:

我需要一个 Delphi 2010 的工作函数来检查是否有可用的 Internet 连接。

我说工作是因为到目前为止我尝试了 4 种不同的方法,例如http://delphi.about.com/b/2005/04/22/how-to-check-for-internet-connection-using-delphi-code.htm 但都没有用。

例如,一种方法总是返回互联网连接,即使电缆不在电脑中,另一种方法则相反(它总是说没有连接)。

     procedure TForm1.Button1Click(Sender: TObject) ;

      function FuncAvail(_dllname, _funcname: string;
                         var _p: pointer): boolean;
      {return True if _funcname exists in _dllname}
      var _lib: tHandle;
      begin
       Result := false;
       if LoadLibrary(PChar(_dllname)) = 0 then exit;
       _lib := GetModuleHandle(PChar(_dllname)) ;
       if _lib <> 0 then begin
        _p := GetProcAddress(_lib, PChar(_funcname)) ;
        if _p <> NIL then Result := true;
       end;
      end;

      {
      Call SHELL32.DLL for Win < Win98
      otherwise call URL.dll
      }
      {button code:}
      var
       InetIsOffline : function(dwFlags: DWORD):
                       BOOL; stdcall;
      begin
       if FuncAvail('URL.DLL', 'InetIsOffline',
                    @InetIsOffline) then
        if InetIsOffLine(0) = true
         then ShowMessage('Not connected')
         else ShowMessage('Connected!') ;
      end;

【问题讨论】:

  • 你到底尝试了什么?
  • 欢迎来到 StackOverflow。这不是一个代码编写服务,您可以在其中发布您的要求,然后说“给我写一个已经测试过的函数。我稍后会停下来拿它。谢谢。”。我们很高兴帮助回答有关您的代码问题的具体问题,但为此,您需要发布您的代码和问题描述,并首先提出具体问题.如果您需要按需编写代码,请聘请承包商或顾问。祝你好运。
  • 对不起,我冒犯了你。我认为提供一个有效的链接会让读者点击它。我将代码粘贴到我原来的问题中,谢谢

标签: delphi delphi-2010


【解决方案1】:

唯一可靠的方法是尝试连接到互联网上某处的真实服务器,看看它是成功还是失败。不要使用依赖操作系统状态信息的操作系统功能,因为这些数据很容易不同步。

【讨论】:

  • 我们需要更深入地研究“连接到互联网”的定义。
  • 如果我只想检查 LAN 连接(电缆断开)怎么办?
  • @tdiop 查看Network List Manager API。但是考虑到现在很多网络都是无线的,可能没有使用电缆
【解决方案2】:

在您的使用中添加“WinNet”单元。使用函数“InternetGetConnectedState”返回 Internet 状态和类型的值。见下文:

function YourFunctionName : boolean;
  var
     origin : cardinal;
  begin
     result := InternetGetConnectedState(@origin,0);

     //connections origins by origin value
     //NO INTERNET CONNECTION              = 0;
     //INTERNET_CONNECTION_MODEM           = 1;
     //INTERNET_CONNECTION_LAN             = 2;
     //INTERNET_CONNECTION_PROXY           = 4;
     //INTERNET_CONNECTION_MODEM_BUSY      = 8;
  end;

更新我较新的 Delphi 版本添加了“wininet”作为使用类。

【讨论】:

  • 正确:使用 WinINet
【解决方案3】:

您可以使用TIdHTTP 组件:

function TMainF.isInternetConnection: Boolean;
begin
  try
    IdHTTP.Get('http://www.svtech.cz');
  except
    on E: Exception do begin
      if not (E is EIdHTTPProtocolException) then begin
        Result := False;
        Exit;
      end;
    end;
  end;
  Result := True;
end;

【讨论】:

  • TIdHTTP 失败的原因有很多,无论是与套接字相关还是与 HTTP 相关。您必须分析引发的异常以找出失败的原因。例如,在套接字错误时返回 false 是有意义的,但由于连接成功,所以在 HTTP 错误时返回 false 是有意义的。
  • @Remy Lebeau 是的,尤其是现在,大多数页面已经转移到 HTTPS,这个 sn-p 很可能会“按原样”失败 HTTPS。
  • @ChrisS。也许,也许不是。 TIdHTTP 支持 HTTPS,您只需要将 SSLIOHandler 组件分配给 TIdHTTP.IOHandler 属性。 TIdHTTP can create a default SSLIOHandler for you,但它目前仅默认为 TLS 1.0,网站开始远离。要使用 TLS 1.1+,您必须手动分配 SSLIOHandler
  • 我改成'svtech.czsdfsdfasdfasfdas',结果还是真的
猜你喜欢
  • 1970-01-01
  • 2012-04-18
  • 1970-01-01
  • 1970-01-01
  • 2010-10-05
  • 2019-10-03
  • 1970-01-01
相关资源
最近更新 更多