You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
120 lines
2.0 KiB
120 lines
2.0 KiB
package nets
|
|
|
|
import (
|
|
"net"
|
|
"regexp"
|
|
"strconv"
|
|
"strings"
|
|
)
|
|
|
|
// 检测是否为 IP 格式
|
|
func CheckIp(addr string) bool {
|
|
if "" == addr {
|
|
return false
|
|
}
|
|
|
|
a := net.ParseIP(addr)
|
|
if a == nil {
|
|
return false
|
|
}
|
|
|
|
return true
|
|
}
|
|
|
|
// 检测 地址是否为 IP:端口 格式
|
|
func CheckHostAddr(addr string) bool {
|
|
|
|
if "" == addr {
|
|
return false
|
|
}
|
|
|
|
items := strings.Split(addr, ":")
|
|
if items == nil || len(items) != 2 {
|
|
return false
|
|
}
|
|
|
|
a := net.ParseIP(items[0])
|
|
if a == nil {
|
|
return false
|
|
}
|
|
|
|
match, err := regexp.MatchString("^[0-9]*$", items[1])
|
|
if err != nil {
|
|
return false
|
|
}
|
|
|
|
i, err := strconv.Atoi(items[1])
|
|
if err != nil {
|
|
return false
|
|
}
|
|
if i < 0 || i > 65535 {
|
|
return false
|
|
}
|
|
|
|
if match == false {
|
|
return false
|
|
}
|
|
return true
|
|
}
|
|
|
|
// 获取一个空闲的TCP端口
|
|
func GetFreePort(bind string) int {
|
|
ip := ":"
|
|
if "" != bind {
|
|
ip = bind + ":"
|
|
}
|
|
|
|
var port int
|
|
for i := 17070; i < 65536; i++ {
|
|
addr, _ := net.ResolveTCPAddr("tcp", ip+strconv.Itoa(i))
|
|
listener, err := net.ListenTCP("tcp", addr)
|
|
if err == nil {
|
|
listener.Close()
|
|
port = i
|
|
break
|
|
}
|
|
}
|
|
return port
|
|
}
|
|
|
|
func IsUsableTcpAddr(addr string) (bool, error) {
|
|
listener, err := net.Listen("tcp", addr)
|
|
if err != nil {
|
|
return false, err
|
|
}
|
|
listener.Close()
|
|
return true, nil
|
|
}
|
|
|
|
func IsActiveTCPAddr(addr string) (bool, error) {
|
|
tcpAddr, _ := net.ResolveTCPAddr("tcp", addr)
|
|
conn, err := net.DialTCP("tcp", nil, tcpAddr)
|
|
if err != nil {
|
|
return false, err
|
|
}
|
|
defer conn.Close()
|
|
|
|
return true, nil
|
|
}
|
|
|
|
func GetIpList() ([]string, error) {
|
|
var ips []string
|
|
netInterfaces, err := net.Interfaces()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
for i := 0; i < len(netInterfaces); i++ {
|
|
if (netInterfaces[i].Flags & net.FlagUp) != 0 {
|
|
ls, _ := netInterfaces[i].Addrs()
|
|
for _, address := range ls {
|
|
if ipNet, ok := address.(*net.IPNet); ok && !ipNet.IP.IsLoopback() {
|
|
if ipNet.IP.To4() != nil {
|
|
ips = append(ips, ipNet.IP.String())
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return ips, nil
|
|
}
|
|
|