iot_server/internal/pkg/utils/net.go

117 lines
2.5 KiB
Go

package utils
import (
"fmt"
"net"
"strconv"
"strings"
"time"
)
// CheckNetIface 检查网卡
func CheckNetIface(ethName string) bool {
return strings.HasPrefix(ethName, "en") || strings.HasPrefix(ethName, "eth")
}
// NetIfaces 获取网卡
func NetIfaces() ([]string, error) {
interfaces, err := net.Interfaces()
if err != nil {
return nil, err
}
var ifaces []string
for _, inter := range interfaces {
if CheckNetIface(inter.Name) {
ifaces = append(ifaces, inter.Name)
}
}
return ifaces, nil
}
func NetMacs() ([]string, error) {
interfaces, err := net.Interfaces()
if err != nil {
return nil, err
}
var ifaces []string
for _, inter := range interfaces {
if CheckNetIface(inter.Name) {
ifaces = append(ifaces, inter.HardwareAddr.String())
}
}
return ifaces, nil
}
// 获取系统可用的的端口号, 如果传入的端口号可用,那就直接返回
func GetAvailablePort(port string) (int, error) {
address, err := net.ResolveTCPAddr("tcp", fmt.Sprintf("%s:0", "0.0.0.0"))
if err != nil {
return 0, err
}
// 如果没有被占用 就直接返回
if !checkPortIsOpen(port) {
return strconv.Atoi(port)
}
return AvailablePort(address)
}
func AvailablePort(address *net.TCPAddr) (int, error) {
listener, err := net.ListenTCP("tcp", address)
if err != nil {
return 0, err
}
defer listener.Close()
return listener.Addr().(*net.TCPAddr).Port, nil
}
func checkPortIsOpen(port string) bool {
timeout := time.Second
conn, err := net.DialTimeout("tcp", net.JoinHostPort("127.0.0.1", port), timeout)
if err != nil {
return false
}
if conn != nil {
defer conn.Close()
return true
}
return false
}
func GetLocalIP() (ip string, err error) {
addrs, err := net.InterfaceAddrs()
if err != nil {
return
}
for _, addr := range addrs {
ipAddr, ok := addr.(*net.IPNet)
if !ok {
continue
}
if ipAddr.IP.IsLoopback() {
continue
}
if !ipAddr.IP.IsGlobalUnicast() {
continue
}
return ipAddr.IP.String(), nil
}
return
}
func GetOutBoundIP() (ip string, err error) {
conn, err := net.Dial("udp", "8.8.8.8:53")
if err != nil {
return
}
localAddr := conn.LocalAddr().(*net.UDPAddr)
ip = strings.Split(localAddr.String(), ":")[0]
return
}