【问题标题】:How to get number of packets received, Average round trip time from ping command if I use popen如果我使用 popen,如何从 ping 命令获取接收的数据包数量,平均往返时间
【发布时间】:2023-10-26 17:03:02
【问题描述】:

我必须 ping 给定的 IP 地址,并且需要在 C++ 中打印以下值。可以使用popen获取输出。

1) Average Response Time
2) Data Block Size
3) Failure Count
4) Max. Response time
5) Min. Response time
6) Number Of Repetitions
7) Success Count
8) TimeOut

如果我使用 popen,我会得到一个文件指针,我需要读取这个文件指针以获取整个输出,并且我必须使用一些字符串操作来提取值。任何人都可以让我知道是否有任何其他方法可以代替使用字符串操作?操作系统是否会维护任何数据结构,通过它我可以在执行 ping 命令后获取值?

【问题讨论】:

  • 不,ping 不是操作系统原语,它是由应用程序ping 实现的功能。您可以使用该程序并解析其输出,也可以自己重新实现所有这些功能。后者不应该太难,因为ping是开源的,但你应该小心许可。
  • “我不想做一些简单得可笑的事情。肯定有一些非常困难的方法,对吧?”
  • @DavidSchwartz :我觉得读取数据结构值比进行字符串操作更容易。你觉得不一样吗?无论如何,现在很明显不会有任何结构维护,我必须做你更简单的方法:)
  • @kadina 是的,我确实感觉不一样。在内核中维护数据结构并创建和使用 API 来访问它比仅解析一些字符串要复杂得多。如果您不相信我,请尝试两种方法,看看哪种方法会花费您更长的时间。

标签: c++ linux ping


【解决方案1】:

我想不出比从您读取的字符串中提取结果更好的方法了。正是解析字符串的最佳方法,我不确定 [主要是因为我没有花太多时间思考这个问题!]

当然,另一种方法是编写自己的 ping 内部实现,但我相当确定这比在系统 ping 上的 popen 上使用解析器要多得多 - 除非你想要非常便携的代码[但那也需要一个非常便携的网络包,因为本地网络也不是很便携]。

【讨论】:

    最近更新 更多