有谁知道,如何在c ++中捕获ping的返回值?根据这个link:
ping应成功返回0
,失败时返回1
,例如未知主机,非法数据包大小等,2
在无法访问的主机或网络上。
在C ++中,我使用system ()
调用ping,例如int ret = system("ping 192.168.1.5");
。
我的问题是,ret
的值为0
或1
。永远不会2
!如果我认为正确,这是因为,我得到的这个返回值是系统函数的返回值,而不是ping的。那么我怎么能得到ping的回报呢?
提前致谢!
kampi
编辑: 现在我使用这个系统(“ping 192.169.1.5> ping_res.txt”);但我不想使用文件(打开,阅读它们),这就是为什么我想要捕获,如果可能的话返回值:)
答案 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端口上向主机发送任意数据来自行测量。编写代码需要一些时间,但我认为这对于灵活性和准确性是值得的。