【问题标题】:How to verify if remote computer is available?如何验证远程计算机是否可用?
【发布时间】:2016-06-15 13:26:04
【问题描述】:

我正在编写程序的一部分,该程序应将一批文件从当前计算机复制到定义的计算机列表中。 如果这些计算机不可用,代码将在尝试访问它们时挂起很长时间。 C# 中是否有任何功能可以检查机器是否可用,如果不可用则跳过?

MFWs = File.ReadAllLines(GuiManager.MyConfigManagerConfig.MachinesList);
        foreach (string MFW in MFWs)
        {
          if (MFW != System.Environment.MachineName)
          {
            String target = @"\\" + MFW + @"\D\IbSi\config\" + Path.GetFileName(ConfigFile);
            String backup = @"\\" + MFW + @"\D\IbSi\userdata\" + Path.GetFileName(ConfigFile);
            try
            {
              File.Copy(source, target, true);
              File.Copy(source, backup, true);
            }
            catch (Exception ex)
            {
              Manager.SendMessage("Failed to copy " + Path.GetFileName(ConfigFile) + " to " + MFW + "\n" + ex.Message);
            }
          }
        }

【问题讨论】:

  • 你总是在处理“当你请求它是否可用时它可能可用,但当你真正需要它时却不是。”;所以你最好的选择是尝试操作。您可以做一些事情;确保本地计算机上的 DNS 条目是最新的;也许这会减少解决所需的时间。看起来这个 Stack Overflow 问题就是这样处理的;通过使用线程(或任务)执行某些任务(如文件复制)并在时间过长时超时:stackoverflow.com/questions/1232953/…

标签: c#


【解决方案1】:

您可以在开始复制之前 ping 计算机(取自 this 答案):

using System.Net.NetworkInformation;

public static bool IsHostAvailable(string nameOrAddress)
{
    bool pingable = false;
    Ping pinger = new Ping();
    try
    {
        PingReply reply = pinger.Send(nameOrAddress);
        pingable = reply.Status == IPStatus.Success;
    }
    catch (PingException)
    {
        // Discard PingExceptions and return false;
    }
    return pingable;
}

如 cmets 中所述,您需要确保服务器上的防火墙对 ping(ICMP 回显请求)开放

【讨论】:

  • 注意,如果远程计算机已配置为阻止 ping,那么即使计算机可用,此例程也将始终返回 false。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-11-10
  • 1970-01-01
  • 2010-10-09
  • 1970-01-01
  • 1970-01-01
  • 2011-11-10
  • 1970-01-01
相关资源
最近更新 更多