【问题标题】:Check if device "connected" / available检查设备是否“已连接”/可用
【发布时间】:2011-05-31 07:48:03
【问题描述】:

我用 C 语言编写了一个程序,它通过 udp 与 Arduino 进行通信。 我的问题是,如何在 C (unix) 中“ping”一个 IP 地址并只获得 1 或 0(可用或不可用)。

system("ping xxx.xxx.xxx.xxx"); 调用不起作用,因为它输出了一个列表...?

【问题讨论】:

    标签: c networking udp ping


    【解决方案1】:
    system("ping -c 1 127.0.0.1 > /dev/null");
    

    应该做的伎俩。 -c 1 只发送一个数据包。我们通过管道发送到/dev/null,因为我们不关心标准输出的输出(您指的是那个列表吗?)。如果您还想丢弃 stderr,请在末尾添加 2>&1。您可能还想使用-W 来限制响应时间。

    调用将返回一个表示成功或失败的整数。 0 表示成功,而非零整数表示失败。这是一些示例代码:http://ideone.com/cf0eR

    请注意,ping 失败并不能保证设备处于离线状态。尽管在您的受控环境中,期望它工作可能是合理的。

    【讨论】:

    • 我试过了,但它实际上并没有输出任何东西,如果设备连接与否...
    • @JNK 正如我所解释的,system() 函数返回一个整数。我故意通过管道丢弃所有其他输出到/dev/null
    • 要丢弃标准输出和标准错误,请使用符合 POSIX 标准的 >/dev/null 2>&1 而不是 bashism &>/dev/null。在许多系统上,system() 不使用 bash,&>/dev/null 会将ping 放在后台,然后是一个重定向到/dev/null 的空命令。
    • @jilles 不知道!编辑它。
    【解决方案2】:

    通常,您无法确定网络主机是否已启动 - IP 网络的成员被允许不发送任何数据包。最好的方法是刚开始通信并使用要求被联系机器以任何方式回答的协议。

    但是,如果您确定机器响应 ping,而不是您的 UDP 数据包,请使用ping -c 1 192.0.32.10。这个解决方案虽然很脆弱:

    • 机器可能无法响应 ping
    • 网络(即您和主机之间的防火墙)可能无法中继您的 ping 消息,但可以很好地中继 UDP 数据包
    • 网络实际上可以随时更改。当您收到 ping 回复时,您只知道发送消息时远程主机启动

    【讨论】:

      猜你喜欢
      • 2013-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多