我希望能够从 获得每个网络端口的必要详细信息/etc/services
。如果我必须开发一个 C++ 程序来获取每个端口的状态,我应该如何启动它?我不允许在我的程序中调用 或任何类似的内容netstat
。ss
文件系统中是否有一些文件可以从中获取信息?
答案1
我仍然不清楚你是否想要实现andnetstat -a -t -u
的外连接,或者其他什么,但这里有一些可能有帮助的想法:/etc/services
netstat -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
这将列出系统上所有开放的端口。