Golang 获取当前系统所有监听端口
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
}
代码说明:
- 获取网络接口: 使用
net.Interfaces()获取当前系统的所有网络接口。 - 遍历地址: 对于每个网络接口,使用
iface.Addrs()获取其所有地址,并遍历每个地址。 - 判断 IP 地址类型: 判断地址是否为 IPv4 地址,并排除回环地址。
- 获取端口: 使用
getPort函数获取指定 IP 地址正在监听的端口。 - 输出结果: 打印网络接口名称、IP 地址和端口号。
getPort 函数说明:
- 监听端口: 使用
net.Listen('tcp', fmt.Sprintf('%s:0', ip))在指定 IP 地址上监听一个随机端口。 - 获取端口号: 使用
conn.Addr().(*net.TCPAddr).Port获取监听端口的端口号。 - 关闭连接: 使用
conn.Close()关闭监听连接,释放资源。
注意:
- 以上代码仅获取 IPv4 地址的监听端口。
getPort函数可能会因为权限问题而失败,例如需要 root 权限才能监听某些端口。
原文地址: https://www.cveoy.top/t/topic/fKGo 著作权归作者所有。请勿转载和采集!