测试互联网连接的最快方法

ant*_*009 22 c# networking

C#2008 SP1

我使用此代码连接到我们的客户端网站.这适用于软电话应用程序.在用户拨打电话之前,软电话必须测试是否存在活动的Internet连接.

所以,希望我所做的是使用httpWebRequest类连接到我们的客户网站.如果响应正常,则可以继续进行Internet连接.

但是,我注意到响应的响应时间太长.我不确定这不是一种非常有效的测试方法.

但是,当我浏览他们的网站时,加载页面只需不到一秒钟.但是当我使用HttpWebRequest类时需要太长时间

所以对此的要求是:

有时会在客户办公室使用代理.我不能使用TCPClient类(没有代理属性).

代理不支持SOCKS,因此无法使用Sockets类.

我需要使用超时属性.所以不能使用WebClient类.这是因为软电话会冻结,直到返回响应.几秒钟后超时.

所以我唯一能想到的就是HttpWebRequest类.

  HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://www.xxxxxxxxx.com");
            request.Timeout = 5000;
            request.Credentials = CredentialCache.DefaultNetworkCredentials;
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();

            if (response.StatusCode == HttpStatusCode.OK)
            {
                Console.WriteLine("IsSIPServerAvailable: " + response.StatusCode);
                isAvailable = true;
            }
Run Code Online (Sandbox Code Playgroud)

========使用p\Invoke编辑====

 [DllImport("wininet.dll", CharSet = CharSet.Auto)]
    private extern static bool InternetGetConnectedState(ref InternetConnectionState_e lpdwFlags, int dwReserved);

 [Flags]
    enum InternetConnectionState_e : int
    {
        INTERNET_CONNECTION_MODEM = 0x1,
        INTERNET_CONNECTION_LAN = 0x2,
        INTERNET_CONNECTION_PROXY = 0x4,
        INTERNET_RAS_INSTALLED = 0x10,
        INTERNET_CONNECTION_OFFLINE = 0x20,
        INTERNET_CONNECTION_CONFIGURED = 0x40
    }

 // In function for checking internet
 InternetConnectionState_e flags = 0;          
 bool isConnected = InternetGetConnectedState(ref flags, 0);
Run Code Online (Sandbox Code Playgroud)

Ree*_*sey 16

尝试使用P/Invoke调用InternetGetConnectedState.这应该告诉您是否配置了连接.然后,您可以尝试使用InternetCheckConnection检查与服务的特定连接.这有时(有时)比直接连接连接更快,但我会测试它是否比预先完成连接更好.

  • 这个(IMO)的缺点是它只告诉你计算机是否连接到"一般的互联网".它只是在某种程度上表明您是否能够获得您所追求的特定服务.IMO的最佳方法是连接到这项服务.当然,这并不能保证它在一秒钟之后仍然有效,但我认为如果可能的话,这是一个更好的指标.(在某些情况下,它不是,例如,只是连接会产生某种电荷.) (3认同)

Jon*_*eet 11

什么是软电话用于真正的通信?这是通过HTTP/HTTPS到同一个网站吗?如果是这样,那绝对是正确的方法 - 下一步就是找出为什么这么长时间.

在您提出请求之前,网络连接是否已确定?你是不是事先没有提出任何要求?我问,因为我注意到你没有处理响应 - 如果在其他地方也发生这种情况,你可能会发现你正在运行连接池,只能给你一些特定服务器的连接.道德是要始终把声明放在HttpWebResponse一个using声明中.当然,这可能不是你的问题,但值得一试.

如果您的实际应用程序要连接到其他地方,那么您的测试也应该检查.基本上,尽可能接近真实的东西.

出于兴趣,你说这是一个"软电话"应用程序 - 这实际上是一些描述的手机上运行,使用紧凑的框架,还是桌面应用程序?


Bri*_*eil 6

我有类似的情况,我们打算对客户端进行WCF调用,如果客户端无法访问(无论出于何种原因),则需要很长时间.我所做的是打开一个原始TCP套接字到客户端地址...如果客户端没有在端口(在你的情况下是端口80)监听,如果它们在那里很快就会成功,这会很快失败.

这给了我最快,最准确的答案,以确定我是否能够与我试图达到的端点进行通信.唯一的缺点是你必须自己在套接字上管理超时,因为只有发送和接收超时选项没有连接.

它是这样的......

Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

    try
    {
         IAsyncResult result = socket.BeginConnect("www.xxxxxxxxx.com", 80, null, null );
         //I set it for 3 sec timeout, but if you are on an internal LAN you can probably 
         //drop that down a little because this should be instant if it is going to work
         bool success = result.AsyncWaitHandle.WaitOne( 3000, true );

         if ( !success )
         {
                throw new ApplicationException("Failed to connect server.");
         }

         // Success
         //... 
    }
    finally
    {
         //You should always close the socket!
         socket.Close();
    }
Run Code Online (Sandbox Code Playgroud)

我没有在我面前使用的实际代码,但这应该让你走上一般道路.