C#测试活动互联网连接。ping google.com

C#测试活动互联网连接。ping google.com,c#,networking,C#,Networking,2008年 我正在使用此代码测试internet连接。因为我的应用程序必须登录到web服务器。但是,如果用户internet连接失败或电缆被拔出。我必须通知用户 // Ping www.google.com to check if the user has a internet connection. public bool PingTest() { Ping ping = new Ping(); PingReply pingStatus =

2008年

我正在使用此代码测试internet连接。因为我的应用程序必须登录到web服务器。但是,如果用户internet连接失败或电缆被拔出。我必须通知用户

 // Ping www.google.com to check if the user has a internet connection.
    public bool PingTest()
    {
        Ping ping = new Ping();

        PingReply pingStatus = ping.Send(IPAddress.Parse("208.69.34.231"));

        if (pingStatus.Status == IPStatus.Success)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
我想我能测试互联网连接的唯一方法就是ping www.google.com。所以我使用了一个服务器定时器,我已经设置了500毫秒,在失效事件中它将调用这个ping函数。如果ping返回false。然后我的应用程序将采取适当的操作

你认为用谷歌测试互联网连接是件好事吗。如果谷歌失败,那么我的应用程序将无法运行。1/2秒的投票是多还是少?只是想知道我的整个想法是好是坏


非常感谢,

建议输入0.5秒以上,因为有时候你的lataency会变得更高。我有时甚至会在DSL上使用3.5秒。

为什么要ping谷歌?您真正关心的唯一服务器是您想要与之交谈的web服务器,对吗?所以,我选择了这个。这样,如果用户与web服务器之间出现任何问题,您可以通知用户-这是唯一重要的事情

如果互联网出现问题,这意味着用户只能在自己的城镇内做任何事情,你可能无法访问谷歌,但如果你仍然可以访问你感兴趣的web服务器,为什么要报告问题?另一方面,如果web服务器宕机,但谷歌没有,为什么你不想告诉用户有问题

同样,为什么要使用ping?为什么不向web服务器上的已知URL发送HTTP请求?毕竟,如果网络在运行,但web服务器进程本身在运行,那么这肯定和用户的网络在运行一样糟糕


编辑:我在问题中没有注意到你每半秒钟重复一次。这对任何人来说都不愉快。当然,一分钟一次就足够了,不是吗?

我可能遗漏了一些东西,但是,为什么在需要使用它之前需要测试服务器是否已启动以及web服务是否正在运行?如果您在web服务中调用了一个方法,但没有得到及时的响应,那么您需要采取什么行动

这似乎是设计的过度工程化

[编辑]

谢谢你的澄清。你应该听听网络摇滚的播客插曲“Udi Dahan Scales Web Applications!”(日期12/08/2008)。他们讨论将GUID添加到请求中,并等待您在响应中获得相同的GUID。也许你可以在10次尝试后每秒触发一次,如果在10次尝试后你没有得到回复(带有GUID),那么你可以采取必要的措施吗


祝你好运

我有一个应用程序需要做类似的事情。我们有一个不同的体系结构,即发布/订阅消息总线。对于那些对听到各种服务的“心跳”感兴趣的应用程序,我们允许他们向总线注册他们的兴趣。每隔几秒钟左右,每个服务都将发布一条健康状态消息,然后消费者将收到该消息。如果消费者在一定时间内没有收到健康状态消息,他们可以采取适当的措施,直到再次听到


此设置比轮询服务器或更糟糕的ping服务器更具可伸缩性。想象一下,如果您有100或1000个客户端,所有客户端都每隔几秒钟轮询或ping您的服务器。糟糕。

检查这个重复的问题,它有一个不需要ping的好答案:


您可以订阅System.Net.NetworkInformation.NetworkChange.NetworkAvailabilityChanged事件,只有在该事件指示网络已关闭时,才能向服务器发出ping/web请求,查看它是否可用。

最好查看您是否在网络上,而不是麻烦服务器ping它。例如,见。如果您使用的是Windows 7/Server 2008 R2,那么当连接发生变化时,您会收到一个事件,这对每个人来说都比持续的ping和轮询要快乐得多。

您可以像这样简单地进行测试

[DllImport("wininet.dll")]
private extern static bool InternetGetConnectedState(out int conn, int val);
C#完整源代码


尽管我同意Jon的观点,ping您的Web服务器可能是我想加入的另一个解决方案的最佳方案,该解决方案可以单独使用,也可以与对服务的初始ping一起使用

这是名为
NetworkAvailabilityChanged
NetworkChange
类上的内置事件,可用于从Windows获取总体状态,无论您是否联机。只需向它添加一个侦听器,当它发生更改时,您就会收到通知

private void MyForm_Load(object sender, EventArgs e)
{
    NetworkChange.NetworkAvailabilityChanged += new NetworkAvailabilityChangedEventHandler(NetworkChange_NetworkAvailabilityChanged);
}

private void NetworkChange_NetworkAvailabilityChanged(object sender, NetworkAvailabilityEventArgs e)
{
    if (e.IsAvailable)
    {
        WriteLog("Network is available again, updating items");
        timer1_Tick(sender, EventArgs.Empty);
        return;
    }

    WriteLog("Network isn't available at the moment");
}

可从.Net 2.0及更高版本获得。有关更多信息,请访问。

除了其他内容外,请不要使用类似的if语句。将代码的最后8行更改为:“return pingStatus.Status==IPStatus.Success;”很遗憾,我没有一个好的答案给你,但是你可能不想每0.5秒ping一个站点,你可能会被阻止。如果你选择任意主机,我还建议你尝试一组主机。www.google.com、www.live.com、www.yahoo.com等。。并且仅当所有3个都失败时才通知用户。如果用户和google之间的路由器出现故障,但他们仍在internet上,您不想错误地提醒他们连接已断开。为什么您的逻辑不是:ConnectToMyServer()If(fail){PingGoogle()}If(GooglePingFailed),然后通知用户其故障原因?或者使用Http代替ping。。。很常见的情况是,所有端口都被阻止,但有80个端口被关闭。如果对服务器的ping失败,可以ping Google。这样他就可以知道用户是否在网络上,但服务器已关闭。出于安全原因,已在web服务器上禁用ping(icmp)。我确实创建了一个套接字来测试web服务器的端口号。但是,它的响应非常慢。不过是哪个端口?当然,你唯一关心的是一个监听网络请求的人。该应用程序需要重新启动