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 更好的选择吗?

4

1 回答 1

3

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

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

Ping 使用一些站点选择通过防火墙阻止的 ICMP。如果那是开放的,这是一个廉价的通话,开销很小。

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

您可能希望使用计时器在后台线程上进行轮询。查看BackgroundWorker 类ThreadPool.QueueUserWorkitem

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

附带说明一下,最后一段代码可以简化为:

return reply.Status == IPStatus.Success;
于 2012-11-17T13:21:45.537 回答