Golang 获取当前系统所有监听端口

在 Go 语言中,可以使用 net 包来获取当前系统所有正在监听的端口。以下是一个完整的代码示例:

package main

import (
	'fmt'
	'net'
)

func main() {
	// 获取所有网络接口
	interfaces, err := net.Interfaces()
	if err != nil {
		fmt.Println('获取网络接口失败:', err)
		return
	}

	// 遍历每个网络接口
	for _, iface := range interfaces {
		// 获取当前网络接口的所有地址
		addrs, err := iface.Addrs()
		if err != nil {
			fmt.Println('获取接口地址失败:', err)
			continue
		}

		// 遍历每个地址
		for _, addr := range addrs {
			// 判断是否为IP地址
			if ipnet, ok := addr.(*net.IPNet); ok && !ipnet.IP.IsLoopback() {
				// 判断是否为IPv4地址
				if ipnet.IP.To4() != nil {
					// 获取当前地址的端口
					port := getPort(ipnet.IP.String())
					fmt.Printf('接口:%s,地址:%s,端口:%d\n', iface.Name, ipnet.IP.String(), port)
				}
			}
		}
	}
}

// 获取指定IP地址的端口
func getPort(ip string) int {
	conn, err := net.Listen('tcp', fmt.Sprintf('%s:0', ip))
	if err != nil {
		fmt.Println('监听端口失败:', err)
		return 0
	}
	defer conn.Close()

	return conn.Addr().(*net.TCPAddr).Port
}

代码说明:

  1. 获取网络接口: 使用 net.Interfaces() 获取当前系统的所有网络接口。
  2. 遍历地址: 对于每个网络接口,使用 iface.Addrs() 获取其所有地址,并遍历每个地址。
  3. 判断 IP 地址类型: 判断地址是否为 IPv4 地址,并排除回环地址。
  4. 获取端口: 使用 getPort 函数获取指定 IP 地址正在监听的端口。
  5. 输出结果: 打印网络接口名称、IP 地址和端口号。

getPort 函数说明:

  1. 监听端口: 使用 net.Listen('tcp', fmt.Sprintf('%s:0', ip)) 在指定 IP 地址上监听一个随机端口。
  2. 获取端口号: 使用 conn.Addr().(*net.TCPAddr).Port 获取监听端口的端口号。
  3. 关闭连接: 使用 conn.Close() 关闭监听连接,释放资源。

注意:

  • 以上代码仅获取 IPv4 地址的监听端口。
  • getPort 函数可能会因为权限问题而失败,例如需要 root 权限才能监听某些端口。
Golang 获取当前系统所有监听端口

原文地址: https://www.cveoy.top/t/topic/fKGo 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录