如何在C ++中捕获ping的返回值

时间:2009-10-15 05:03:06

标签: c++ windows

有谁知道,如何在c ++中捕获ping的返回值?根据这个link: ping应成功返回0,失败时返回1,例如未知主机,非法数据包大小等,2在无法访问的主机或网络上。

在C ++中,我使用system ()调用ping,例如int ret = system("ping 192.168.1.5");

我的问题是,ret的值为01。永远不会2!如果我认为正确,这是因为,我得到的这个返回值是系统函数的返回值,而不是ping的。那么我怎么能得到ping的回报呢?

提前致谢!

kampi

编辑: 现在我使用这个系统(“ping 192.169.1.5> ping_res.txt”);但我不想使用文件(打开,阅读它们),这就是为什么我想要捕获,如果可能的话返回值:)

4 个答案:

答案 0 :(得分:6)

如果您使用的是Windows,最好直接使用IcmpSendEcho2在应用程序中实现ping功能。

答案 1 :(得分:1)

一个简单的解决方案是将ping的输出传递给文件并读取它。

E.g。

system("ping 192.169.1.5 > ping_res.txt");

阅读ping_res.txt以获取您需要的信息。

答案 2 :(得分:1)

来自Linux上的man 3 system

  

返回值
  错误时返回的值为-1(例如fork(2)失败),否则返回命令的返回状态。后一种返回状态采用wait(2)中指定的格式。

然后从Linux上的man 2 wait

  

如果status不为NULL,则wait()和waitpid()将状态信息存储在它指向的int中。可以使用以下宏检查此整数(将整数本身作为参数,而不是指向它的指针,就像在wait()和wait-pid()中一样!):

     

WIFEXITED(状态)
  如果子节点正常终止,即通过调用exit(3)或_exit(2),或从main()返回,则返回true。

     

WEXITSTATUS(状态)
  返回子项的退出状态。这包括子项在exit(3)或_exit(2)的调用中指定的status参数的最低有效8位,或者作为main()中return语句的参数。只有在WIFEXITED返回true时才应使用此宏。

来自Linux上的sys / wait.h:

# define WEXITSTATUS(status)    __WEXITSTATUS(__WAIT_INT(status))

来自Linux上的bits / waitstatus.h:

/* If WIFEXITED(STATUS), the low-order 8 bits of the status.  */
#define __WEXITSTATUS(status)   (((status) & 0xff00) >> 8)

换句话说,如果您使用的是Linux,那么您将会使用这些宏。您使用的是HP-UX吗?我注意到您链接到HP-UX的信息。如果是这样,您的man 3 system页面会说什么?

另外,请记住system调用“sh -c 命令”,您将收到sh的返回值:

  

退出状态
  应退回以下退出值:
  0要执行的脚本仅由零个或多个空行或注释组成,或两者兼而有之   1-125非交互式shell检测到语法,重定向或变量赋值错误     127非交互式shell无法找到指定的command_file   否则,shell应返回它调用或尝试调用的最后一个命令的退出状态(另请参见特殊内置实用程序中的退出实用程序)。

如果您尝试,您会找到什么返回值,例如system("exit 203");

答案 3 :(得分:1)

所以你只想知道返回值:即“ 0表示成功,1表示失败,例如未知主机,非法数据包大小等等,2表示无法访问的主机或网络。”我认为在这种情况下使用ping是一种过度杀伤力。写入文件并从中读取显然有点难看。

我认为你应该尝试**打开()与端口7(Echo)上的主机连接。然后你会得到ping返回值告诉你的信息。如果您还想获得响应持续时间,可以通过在echo端口上向主机发送任意数据来自行测量。编写代码需要一些时间,但我认为这对于灵活性和准确性是值得的。