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

C#2008

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

// 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秒多少或太少? 只是想知道我的整个想法是否好?

非常感谢,

为何ping谷歌? 您真正关心的唯一服务器是您想要与之通信的Web服务器,对吧? 所以请相反。 这样,您可以通知用户他们和Web服务器之间是否有任何问题 – 这是唯一重要的事情。

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

同样,为什么要使用ping? 为什么不将HTTP请求发送到Web服务器上的已知URL? 毕竟,如果网络已启动但Web服务器进程本身已关闭,那么肯定与用户网络故障一样糟糕。

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

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

C# – 如何检查网络连接

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

我可能会遗漏一些东西但是,为什么在需要使用它之前需要测试服务器是否已启动并且Web服务是否正在运行? 如果您在Web服务中调用方法并且没有及时得到响应,那么请采取您认为合适或需要的操作?

它似乎超过了设计的工程设计。

[编辑]

感谢robUK的澄清。 您应该收听NET Rocks播客节目’Udi Dahan Scales Web Applications!’ (日期12/08/2008)。 他们讨论了向请求添加GUID并等到响应中获得相同的GUID。 也许你可以在10次尝试时每秒发射一次,如果你在10次尝试后没有得到回复(附有GUID),那么采取必要的行动?

祝它好运..

我有一个需要做类似的应用程序。 我们有一些不同的架构,即发布/发布消息总线。 对于那些有兴趣从各种服务中听取“心跳”的应用程序,我们允许他们在公交车上注册他们的兴趣。 每隔几秒左右,每个服务都会发布一个健康状态消息,消费者将接收该消息。 如果消费者在一段时间内没有收到健康状况消息,他们可以采取适当的行动直到他们再次听到消息。

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

你可以像这样测试

 [DllImport("wininet.dll")] private extern static bool InternetGetConnectedState(out int conn, int val); 

C#完整源代码

http://net-informations.com/csprj/communications/internet-connection.htm

它建议放置超过0.5秒,因为有时候你的能力会提高。 我有时甚至在DSL上有3.5秒。

更好的是看你是否在网络上而不是打扰服务器ping它。 例如,请参阅检测Internet V.本地LAN连接 。 如果您使用的是Windows 7 / Server 2008 R2,则可以在连接发生变化时获得一个事件,这对于每个人来说都会比持续的ping和轮询更快乐。

尽管我同意Jon的看法,ping你的网络服务器可能是最好的想法,我想投入另一个可能单独使用或与初始ping服务一起使用的解决方案。

这些是NetworkChange类的内置事件,名为NetworkAvailabilityChanged ,无论您是否在线,都可以使用该事件从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及以后版本获得。 更多信息可以在MSDN上找到。