2012-11-17 79 views
3

我有基于C#的客户端 - 服务器体系结构。客户端将连接到服务器并交换数据。连续检查服务器的状态

我需要连续检查服务器状态,如果服务器出现故障(从网络中删除或关闭),我需要指示客户端。

如何监控?

如果我在客户端程序中使用Ping实用程序,这将成为性能方面最好的方法,即通过单独的线程或通过后台类进行监视?

public static bool GetPingResponse(string IpAddress, int timeout = 3000) 
     { 
      var ping = new Ping(); 
      var reply = ping.Send(IpAddress, timeout); 
      if (reply.Status == IPStatus.Success) 
      { 
       return true; 
      } 
      else 
      { 
       return false; 
      } 
     } 

在性能和消耗资源方面,还有没有比Ping更好的选择?

+0

如何连接到服务器?你使用tcp吗? – Adil

+0

是的tcp only ..但我需要检查服务器通电状态。不仅是tcp连接状态。 – Olivarsham

+0

可能值得考虑您是否真的需要知道服务器硬件已启动,或者您是否需要知道服务器上的特定服务是否正在运行。 –

回答

3

您需要确保您的电话代表“可用”。例如,如果它是一个http服务器,那么发出ping请求只是说它可以通过网络到达。网络服务器可能关闭,但网络堆栈已启动。如果是这样的话,请打一个像http一样运行更多堆栈的东西。如果有后端数据库,则调用可以通过数据库服务器。这完全取决于你对“可用”的定义。如果要说应用程序可用,则应该查看在整个堆栈中执行路径的调用。

这也取决于服务器的可用性以及客户端和服务器之间通过防火墙打开的内容。

Ping使用某些站点选择通过防火墙阻止的ICMP。如果这是开放的,这是一个便宜的电话,没有多少开销。

如果这被阻止,并且它是一个web服务器,例如通过http,你可以在web服务器上有一个便宜的端点,你可以通过http客户端在C#中调用。

你会想要在一个后台线程上轮询一个计时器。看看BackgroundWorker classThreadPool.QueueUserWorkitem

最后,你可以看看一个监控解决方案 - 有很多可以监控你的服务器的多个方面。如果你走这条路线,客户可以简单地查询监控解决方案,这可能会更好,因为你不会有n个客户端轮询你的服务器 - 只有一个监控堆栈。

在一个侧面说明,代码的最后一块可以简化到:

return reply.Status == IPStatus.Success;