繁体   English   中英

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

[英]How to capture ping's return value in C++

有谁知道,如何在c ++中捕获ping的返回值? 根据此链接 :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”); 但我不想使用文件(打开,并阅读它们),这就是为什么我要捕获,返回值,如果可能的话:)

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

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

例如

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

并阅读ping_res.txt以获取所需的信息。

从Linux上的man 3 system

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

然后从man 2 wait Linux:

如果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 command ”,您将收到sh的返回值:

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

如果你尝试,你会发现什么回报值,例如, system("exit 203");

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM