【问题标题】:Getting active TCP/UDP connections in c++ on linux在 Linux 上的 C++ 中获取活动的 TCP/UDP 连接
【发布时间】:2025-11-29 18:55:02
【问题描述】:

我正在制作需要在 c++ 中获得活动 TCP/UDP 连接的程序? .我知道我可以通过使用 IP Helper API 在 Windows 上做到这一点,但我想知道如何在 C++ 中但在 Linux 上获得活动连接。使用 popen() 函数和 netstat 命令是一个很好的选择还是什么?抱歉英语不好:)

【问题讨论】:

  • 您还没有说“获取”连接是什么意思——您只想要一个端口列表,或者端口和 pid,或者实际控制它们......?无论如何,如果netstat 输出你想要的,那么lsof 可能也值得考虑......
  • @TonyD 是的,我想要这样的 netstat 输出:codeproject.com/Articles/4298/…
  • popen 听起来不错,然后...不妨编写代码,然后如果您有具体问题,请寻求建议....
  • 谢谢,我会用popen函数:)

标签: c++ linux tcp


【解决方案1】:

您可以阅读以下文件:

  • /proc/net/udp
  • /proc/net/tcp

这些文件的内容是以下类型的文本:

sl  local_address rem_address   st tx_queue rx_queue tr tm->when retrnsmt   uid  timeout inode
0: 00000000:5AA0 00000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 237373 1 cf0bc900 100 0 0 10 -1
1: 00000000:5AA1 00000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 237409 1 cf0be880 100 0 0 10 -1
2: 00000000:5AA2 00000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 237435 1 cf0bdf80 100 0 0 10 -1

手册页proc(5) 提供了更多信息。

【讨论】:

  • /proc/net 各种网络伪文件,所有这些都给出了网络层某些部分的状态。这些文件包含 ASCII 结构,因此可以使用 cat(1) 读取。然而,标准的 netstat(8) 套件提供了对这些文件的更清晰的访问。
  • 安全。您可以使用 fopen/fscanf 等普通文件读取函数来完成。 “更清洁的访问”意味着可能更易于阅读的输出和清晰的命令界面(而不是 catting 文件)。
  • 非常感谢 :) 。阅读这个文件比使用 netstat 更容易
【解决方案2】:

要获取打开的活动连接数、失败的连接尝试数、收到的段数、发出的段数等。可以使用 netstat

$ netstat -st

netstat 依次从 /proc/net/snmp 获取此信息。如果您不能依赖 DUT 上的 netstat,您可以通过编程方式从 /proc/net/snmp 读取值。

【讨论】: