2009-10-15 212 views
3

有谁知道,如何在C++中捕获ping的返回值?根据此link: ping应成功返回01发生故障,例如未知主机,非法数据包大小等等和2在无法访问的主机或网络上。如何在C++中捕获ping的返回值

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

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

在此先感谢!

kampi

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

回答

6

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

1

一个简单的解决方案将管道输出ping到一个文件并阅读它。

E.g.

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

而且读ping_res.txt得到你需要的信息。

+0

我现在使用这个“解决方案”,但它会更容易,获得返回值,然后我不应该使用文件。这就是为什么,我想知道如何捕获返回值:) – kampi 2009-10-15 05:17:38

1

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");

1

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

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