我有基于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 :(得分:3)
您需要确保您的电话代表“可用”。例如,如果它是一个http服务器,发出ping请求只是说它可以通过网络访问。 Web服务器可能已关闭,但网络堆栈已启动。如果是这种情况,请调用运行更多堆栈的内容,如http。如果有后端数据库,则调用可以进入数据库服务器。这完全取决于您对“可用”的定义。如果要说应用程序可用,您应该查看一个通过完整堆栈运行路径的调用。
它还取决于服务器可用的内容以及客户端和服务器之间通过防火墙打开的内容。
Ping使用某些网站选择通过防火墙阻止的ICMP。如果那是开放的话,这是一个很便宜的电话,而且开销很小。
如果它被阻止并且它是一个Web服务器,例如通过http,你可以在Web服务器上有一个便宜的端点,你可以通过C#中的http客户端调用。
您可能希望使用计时器在后台线程上进行轮询。查看BackgroundWorker class或ThreadPool.QueueUserWorkitem。
最后,您可以查看一个监控解决方案 - 那里有许多可以监控服务器的多个方面。如果你走这条路,客户端可以简单地查询可能更好的监控解决方案,因为你没有n个客户端轮询你的服务器 - 只有一个监控堆栈。
另外,最后一段代码可以简化为:
return reply.Status == IPStatus.Success;