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

3
有人知道如何在C++中获取ping命令的返回值吗?根据链接,ping应该在成功时返回0,在失败(例如未知主机、非法数据包大小等)时返回1,在无法到达的主机或网络上则返回2
在C++中,我使用system()调用ping,例如:int ret = system("ping 192.168.1.5");
我的问题是,ret的值只会是01,从不会是2!如果我想得没有错的话,这是因为我得到的这个返回值是系统函数的返回值,而不是ping的返回值。那么我该如何获取ping的返回值呢?
谢谢!
4个回答

6

如果您使用的是Windows操作系统,建议直接使用IcmpSendEcho2来实现您应用程序中的ping功能。


1
一个简单的解决方案是将ping的输出导入文件并读取它。
例如:
system("ping 192.169.1.5 > ping_res.txt");
然后读取ping_res.txt以获取所需信息。

我现在使用这个“解决方案”,但如果能够获取返回值,那么就不需要再处理文件了,这样会更容易。因此,我想知道如何捕获返回值 :) - kampi

1

来自 Linux 上的 man 3 system

返回值
如果出错(例如 fork(2) 失败),则返回值为 -1,否则为命令的返回状态。后者的格式符合 wait(2) 中指定的格式。

然后是来自 Linux 上的 man 2 wait

如果状态不为NULL,则wait()和waitpid()将状态信息存储在指向的整数中。可以使用以下宏检查此整数(这些宏将整数本身作为参数,而不是像wait()和waitpid()中所做的指向它的指针!):
WIFEXITED(status)返回true,如果子进程正常终止,即通过调用exit(3)或_exit(2),或从main()返回。
WEXITSTATUS(status)返回子进程的退出状态。这由子进程在调用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:
/* 如果 WIFEXITED(STATUS) 为真,则状态的低 8 位。 */ #define __WEXITSTATUS(status) (((status) & 0xff00) >> 8)
换句话说,如果您使用 Linux,则需要使用这些宏。您使用 HP-UX 吗?我注意到您链接到了 HP-UX 的信息。如果是这样,请查看您的 man 3 system 页面上写了什么?
此外,请记住,system 调用 "sh -c command" 并且您将收到 sh 的返回值:
退出状态 以下退出值将被返回: 0 要执行的脚本仅由零个或多个空白行或注释组成。 1-125 非交互式 shell 检测到语法、重定向或变量赋值错误。 127 非交互式 shell 找不到指定的 command_file。 否则,shell 将返回它调用或尝试调用的最后一个命令的退出状态(请参阅特殊内置实用程序中的 exit 实用程序)。

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


1

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接