如何在C++中捕获ping的返回值
有谁知道,如何在C++中捕获ping的返回值?根据此link: ping应成功返回0
,1
发生故障,例如未知主机,非法数据包大小等等和2
在无法访问的主机或网络上。如何在C++中捕获ping的返回值
在C++中,我使用system()
(例如, int ret = system("ping 192.168.1.5");
。
我的问题是,ret
的值是0
或1
。它永远不会2
!如果我认为正确,这是因为,我得到的这个返回值是系统函数的返回值,而不是ping的。那么我怎么能得到ping的返回值?
在此先感谢!
kampi
编辑: 现在,我使用这个系统( “平安192.169.1.5> ping_res.txt”);但我不想处理文件(打开,并阅读它们),这就是为什么我想捕获,如果可能的话返回值:)
一个简单的解决方案将管道输出ping到一个文件并阅读它。
E.g.
system("ping 192.169.1.5 > ping_res.txt");
而且读ping_res.txt
得到你需要的信息。
从man 3 system
在Linux:
返回值
返回的值是1的错误(例如,叉(2)失败),以及以其他方式命令的返回状态。后者的返回状态采用wait(2)中指定的格式。
然后从man 2 wait
在Linux上:在INT
如果状态不为空,等待()和waitpid函数()存储状态信息,它指向。这个整数可以用下面的宏来检查(它将整数本身作为参数,而不是指向它的指针,就像在wait()和wait-pid()!中所做的那样):
WIFEXITED(status)
如果孩子正常结束,即通过调用exit(3)或_exit(2)或从main()返回,则返回true。WEXITSTATUS(状态)
返回孩子的退出状态。这包括子进程在调用exit(3)或_exit(2)时指定的status参数的最低有效8位或作为main()中return语句的参数。仅当WIFEXITED返回true时才应使用此宏。
从SYS/wait.h在Linux上:
# define WEXITSTATUS(status) __WEXITSTATUS(__WAIT_INT(status))
从比特/ waitstatus。h在Linux上:
/* 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");
?
所以你只是想知道返回值:例如“0成功,失败1例如未知主机,非法数据包大小等等,2在无法访问的主机或网络上”我认为使用ping在这种情况下是一个矫枉过正的事情。写入文件并从中读取显然有点难看。
我认为你应该尝试** open()**连接到端口7(Echo)上的主机。然后你会得到ping返回值会告诉你的信息。如果您还想获得响应持续时间,您可以通过在回波端口上向主机发送任意数据来测量它。编写代码需要一些时间,但我认为这是值得的灵活性和准确性。
我现在使用这个“解决方案”,但它会更容易,获得返回值,然后我不应该使用文件。这就是为什么,我想知道如何捕获返回值:) – kampi 2009-10-15 05:17:38