代码拉取完成,页面将自动刷新
package net
import (
"gitee.com/monobytes/gcore/gerrors"
"net"
"strconv"
)
// ParseAddr 解析地址
func ParseAddr(addr string) (listenAddr, exposeAddr string, err error) {
var host, port string
if addr != "" {
host, port, err = net.SplitHostPort(addr)
if err != nil {
return
}
}
if port == "" || port == "0" {
p, err := AssignRandPort(host)
if err != nil {
return "", "", err
}
port = strconv.Itoa(p)
}
if len(host) > 0 && (host != "0.0.0.0" && host != "[::]" && host != "::") {
listenAddr = net.JoinHostPort(host, port)
exposeAddr = listenAddr
} else {
ip, err := InternalIP()
if err != nil {
return "", "", err
}
listenAddr = net.JoinHostPort("0.0.0.0", port)
exposeAddr = net.JoinHostPort(ip, port)
}
return
}
// ExtractIP 提取主机地址
func ExtractIP(addr net.Addr) (ip string, err error) {
ip, _, err = net.SplitHostPort(addr.String())
return
}
// ExtractPort 提取主机端口
func ExtractPort(addr net.Addr) (int, error) {
_, port, err := net.SplitHostPort(addr.String())
if err != nil {
return 0, err
}
return strconv.Atoi(port)
}
// InternalIP 获取内网IP地址
func InternalIP() (string, error) {
ifaces, err := net.Interfaces()
if err != nil {
return "", err
}
var (
addrs []net.Addr
ipnet net.IP
ip string
)
for _, iface := range ifaces {
if iface.Flags&net.FlagUp == 0 {
continue
}
if iface.Flags&net.FlagLoopback != 0 {
continue
}
if addrs, err = iface.Addrs(); err != nil {
return "", err
}
for _, addr := range addrs {
switch v := addr.(type) {
case *net.IPNet:
ipnet = v.IP
case *net.IPAddr:
ipnet = v.IP
default:
err = gerrors.New("invalid addr interface")
continue
}
if ipnet == nil || ipnet.IsLoopback() {
continue
}
if ipv4 := ipnet.To4(); ipv4 != nil && ipv4.IsPrivate() {
if ipv4[0] == 192 && ipv4[1] == 168 {
return ipv4.String(), nil
}
if ip == "" {
ip = ipv4.String()
}
}
}
}
if ip != "" {
return ip, nil
} else {
return "", gerrors.New("not found ip address")
}
}
// ExternalIP 获取外网IP地址
func ExternalIP() (string, error) {
conn, err := net.Dial("udp", "8.8.8.8:54")
if err != nil {
return "", err
}
defer conn.Close()
return ExtractIP(conn.LocalAddr())
}
// AssignRandPort 分配一个随机端口
func AssignRandPort(ip ...string) (int, error) {
addr := ":0"
if len(ip) > 0 {
addr = ip[0] + addr
}
listener, err := net.Listen("tcp", addr)
if err != nil {
return 0, err
}
port := listener.Addr().(*net.TCPAddr).Port
_ = listener.Close()
return port, nil
}
// FulfillAddr 补全地址
func FulfillAddr(addr string) string {
host, port, err := net.SplitHostPort(addr)
if err != nil {
return addr
}
if host == "" {
host = "0.0.0.0"
}
return net.JoinHostPort(host, port)
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。