【问题标题】:Ping: Remote device not able to ping but is connectedPing:远程设备无法 ping,但已连接
【发布时间】:2018-06-12 08:48:42
【问题描述】:

我有一个远程设备(在我的情况下是生物识别)放置在位置 X。在位置 Y 时,我能够连接到该设备。但是,每次连接失败或白天无法连接时,我都需要知道原因。为此,我尝试在每次连接设备或未建立连接时对设备执行 ping 操作,因此我会知道断开连接的原因。下面的 sn-p 返回 false,即即使设备能够连接成功,也无法 ping 通。我尝试增加timeout,但它仍然显示超时,最终无法ping通。

控制器:

bool isPinged = false;
   isConnected = objZkeeper2.Connect_Net(IpAddr, Port);

            if (isConnected)
            {
//considering the connection is established, I am sending a ping req

 isPinged = PingTheDevice(IpAddr);

然后:

public static bool PingTheDevice(string ipAdd)
        {
            try
            {
                IPAddress ipAddress = IPAddress.Parse(ipAdd);

                Ping pingSender = new Ping();
                PingOptions options = new PingOptions();
                options.DontFragment = true;
                byte[] buffer = new byte[32];

                int timeout = 5000;
                PingReply reply = pingSender.Send(ipAddress, timeout, buffer, options);

                if (reply.Status == IPStatus.Success)
                    return true;
                else
                {
                    return false;
                }
            }
            catch (Exception)
            {
                return false;
            }
        }

【问题讨论】:

  • 您确定设备已配置为响应 ping 吗?尽管理论上 IP 网络上的所有设备都应该响应,但有时它们不会响应,或者该功能可能会被禁用。无论如何,ping 报告将如何帮助您准确地确定断开连接的原因?
  • @ADyson 可以说由于某种原因,设备无法远程连接,我需要检查它是否被 ping 通。如果它正在被 ping 但未连接,这意味着问题(连接和数据获取)可能在我这边,不是吗?
  • 您确定没有可能丢弃 ICMP 数据包的设备(防火墙、路由器等)吗?
  • @MickJagz 这可能意味着,或者可能意味着设备的软件已经崩溃并且没有正确响应请求。 ping 可以真正告诉您的是设备已连接到网络。这是一个基本的网络测试。它不会告诉您任何有关其功能状态的信息。

标签: c# .net asp.net-mvc ping biometrics


【解决方案1】:

添加到 ADyson 的评论:是的,可能有设备不响应​​ ping。但我想你已经用 ping.exe 测试过了,不是吗?

您的 ping 代码本身可以工作(刚刚测试过)。但是:您确定 ipAdd 始终包含有效的 IP 地址而不是主机名吗?在后一种情况下,Parse 方法会引发异常。

我查看了我的一些代码,这部分来自一个在生产环境中运行多年的诊断工具。

代码是:

public static bool Ping(string host)
{
    for (int pass = 0; pass < 3; ++pass)
    {
        try
        {
            Ping pingSender = new Ping();
            PingReply reply = pingSender.Send(host);
            if (reply.Status == IPStatus.Success)
                return true;
        }
        catch (Exception)
        {
            return false;
        }
    }

    return false;
}

我没有增加超时,而是使用重试循环。我的经验是第一次 ping 可能会失败。是否增加超时无关紧要。所以我使用自己的重试机制有更好的可靠性。

此外,您可以将其与主机名或 IP 地址一起使用。

【讨论】:

    【解决方案2】:

    请在我的情况下尝试使用此示例代码,它在这里工作。在你的情况下,我正在传递一些随机字符串,它有可能需要一些垃圾值,因此无法 ping 设备。

     public static bool PingTheDevice(string ipAdd)
        {
      try
            {
                IPAddress ipAddress = IPAddress.Parse(ipAdd);
    
                Ping pingSender = new Ping();
                PingOptions options = new PingOptions();
                options.DontFragment = true;
    
                // Create a buffer of 32 bytes of data to be transmitted. 
                string data = "abcdefghijklmnopqrstuvwxyz";
                byte[] buffer = Encoding.ASCII.GetBytes(data);
                int timeout = 120;
                PingReply reply = pingSender.Send(ipAddress, timeout, buffer, options);
    
                if (reply.Status == IPStatus.Success)
                    return true;
                else
                {
                    return false;
                }
            }
            catch (Exception)
            {
                return false;
            }
        }
    

    【讨论】:

    • 好吧,如果我的代码有问题,但为什么设备也没有从 cmd 得到 ping?
    【解决方案3】:

    所有连接到网络的生物识别机器都可以 ping 通。在尝试通过程序之前,请检查您是否能够通过标准 ping 命令 ping 机器。

    一般来说,为了将生物识别机器与您的计算机成功连接,请尝试几个步骤。

    • 检查您的机器是否支持 DHCP。如果支持,启用它并重新启动机器。检查是否可以 ping。
    • 如果上述步骤不起作用,请禁用计算机和机器中的 DHCP。在计算机和考勤机中手动设置 IP、子网掩码和默认网关。确保两者的子网掩码和默认网关相同,并且 IP4 的前 3 部分相同。如果您有问题,请确保连接到计算机和机器的 LAN 线来自同一个交换机/集线器。

    以上步骤将帮助您将生物识别机器与您的计算机连接起来。 ping 验证成功后,您可以直接从您的程序调用objZkeeper2.Connect_Net 连接机器。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-15
    • 2017-11-19
    • 2012-09-13
    • 2016-08-10
    • 2012-12-18
    • 2022-11-11
    • 1970-01-01
    相关资源
    最近更新 更多