gpt4 book ai didi

c# - 持续检查服务器状态

转载 作者:行者123 更新时间:2023-11-30 16:21:14 24 4
gpt4 key购买 nike

我有基于 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 更好的选择?

最佳答案

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

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

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

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

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

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

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

return reply.Status == IPStatus.Success;

关于c# - 持续检查服务器状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13430926/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com