网口状态

网口状态

我希望能够从 获得每个网络端口的必要详细信息/etc/services。如果我必须开发一个 C++ 程序来获取每个端口的状态,我应该如何启动它?我不允许在我的程序中调用 或任何类似的内容netstatss文件系统中是否有一些文件可以从中获取信息?

答案1

我仍然不清楚你是否想要实现andnetstat -a -t -u的外连接,或者其他什么,但这里有一些可能有帮助的想法:/etc/servicesnetstat -a -t -u

  • TCP 和 UDP 端口号范围从 1 到 65536。/etc/services您提到的文件列出了子集知名港口注册港口。更大的列表位于IANA 服务名称和传输协议端口号注册表。您可以使用获取服务()检索 中列出的每条记录/etc/services

  • /proc/net/tcp在 Linux 上,您可以通过读取文件、/proc/net/tcp6/proc/net/udp和来获取所有处于侦听、连接、已连接或部分关闭状态的套接字及其本地和远程地址和端口的列表/proc/net/udp6。的输出netstat -a -t -u -n几乎与这些文件完全相同,只是更漂亮。地址、端口号和状态均为十六进制。状态字段的漂亮版本可以通过使用以下名称来生成/usr/include/netinet/tcp.h

    枚举
    {
      TCP_ESTABLISHED = 1,
      TCP_SYN_SENT,
      TCP_SYN_RECV,
      TCP_FIN_WAIT1,
      TCP_FIN_WAIT2,
      TCP_TIME_WAIT,
      TCP_关闭,
      TCP_CLOSE_WAIT,
      TCP_LAST_ACK,
      TCP_监听,
      TCP_CLOSING
    };
  • 在 FreeBSD 上,您可以调用sysctlbyname("net.inet.tcp.pcblist",...),它会检索结构数组xtcpcb。最好查看netstat源代码以了解如何解释这些结构。

答案2

netstat用于了解网络连接基本知识的工具。您没有指定您使用的操作系统,但我假设 Linux 在这种情况下netstat -tun | awk '{ if ($4 ~ ":<portNumber>") print }'应该可以完成您想要的大部分操作。这会打印所有 TCP 和 UDP 套接字,并选择以冒号和端口号结尾的内容。

例如,寻找连接到sshd我的系统的人。

[root@xxx5b ~]# netstat -tun | awk '{ if ($4 ~ ":22") print }'
tcp        0     64 10.xxx.5.140:22             10.xxx.255.178:51976         ESTABLISHED
tcp        0      0 10.xxx.5.140:22             10.xx.255.178:58535         ESTABLISHED
[root@xxx5b ~]#

如果您不喜欢,awk您可以随时netstat -tun | less直观地扫描输出。如果其中没有列出端口,netstat则表明您的系统存在严重问题。

答案3

使用这个命令:

nmap localhost -p 0-65535

这将列出系统上所有开放的端口。

相关内容