2023-07-21 17:07:04 +08:00
|
|
|
|
package netx
|
2022-07-23 16:41:04 +08:00
|
|
|
|
|
2023-07-20 22:41:13 +08:00
|
|
|
|
import (
|
2023-09-02 17:24:18 +08:00
|
|
|
|
"mayfly-go/pkg/logx"
|
2023-07-20 22:41:13 +08:00
|
|
|
|
"net"
|
2024-05-21 04:06:13 +00:00
|
|
|
|
"strings"
|
2023-07-20 22:41:13 +08:00
|
|
|
|
|
|
|
|
|
|
"github.com/lionsoul2014/ip2region/binding/golang/xdb"
|
|
|
|
|
|
)
|
2022-07-23 16:41:04 +08:00
|
|
|
|
|
|
|
|
|
|
// GetAvailablePort 获取可用端口
|
|
|
|
|
|
func GetAvailablePort() (int, error) {
|
|
|
|
|
|
addr, err := net.ResolveTCPAddr("tcp", "localhost:0")
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return 0, err
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
l, err := net.ListenTCP("tcp", addr)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return 0, err
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
defer func(l *net.TCPListener) {
|
|
|
|
|
|
_ = l.Close()
|
|
|
|
|
|
}(l)
|
|
|
|
|
|
return l.Addr().(*net.TCPAddr).Port, nil
|
|
|
|
|
|
}
|
2023-07-20 22:41:13 +08:00
|
|
|
|
|
|
|
|
|
|
var (
|
|
|
|
|
|
// ip2region数据所在路径,可在(https://gitee.com/lionsoul/ip2region/tree/master/data)处下载
|
|
|
|
|
|
ip2RegionDbPath = "./ip2region.xdb"
|
|
|
|
|
|
useIp2Region = true
|
|
|
|
|
|
vectorIndex []byte
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
// 获取ip归属地信息
|
|
|
|
|
|
func Ip2Region(ip string) string {
|
|
|
|
|
|
if !useIp2Region {
|
|
|
|
|
|
return ""
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if vectorIndex == nil {
|
|
|
|
|
|
// 1、从 dbPath 加载 VectorIndex 缓存,把下述 vIndex 变量全局到内存里面。
|
|
|
|
|
|
vIndex, err := xdb.LoadVectorIndexFromFile(ip2RegionDbPath)
|
|
|
|
|
|
// 第一次加载失败,则默认调整为不使用ip2Region
|
|
|
|
|
|
if err != nil {
|
2023-09-02 17:24:18 +08:00
|
|
|
|
logx.Errorf("failed to load ip2region vector index from `%s`: %s\n", ip2RegionDbPath, err)
|
2023-07-20 22:41:13 +08:00
|
|
|
|
useIp2Region = false
|
|
|
|
|
|
return ""
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
vectorIndex = vIndex
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 2、用全局的 vIndex 创建带 VectorIndex 缓存的查询对象。
|
2025-10-07 15:41:19 +08:00
|
|
|
|
searcher, err := xdb.NewWithVectorIndex(xdb.IPv4, ip2RegionDbPath, vectorIndex)
|
2023-07-20 22:41:13 +08:00
|
|
|
|
if err != nil {
|
2023-09-02 17:24:18 +08:00
|
|
|
|
logx.Errorf("failed to create searcher with vector index: %s\n", err)
|
2023-07-20 22:41:13 +08:00
|
|
|
|
return ""
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
defer searcher.Close()
|
|
|
|
|
|
|
|
|
|
|
|
// do the search
|
|
|
|
|
|
region, err := searcher.SearchByStr(ip)
|
|
|
|
|
|
if err != nil {
|
2023-09-02 17:24:18 +08:00
|
|
|
|
logx.Warnf("failed to SearchIP(%s): %s\n", ip, err)
|
2023-07-20 22:41:13 +08:00
|
|
|
|
return ""
|
|
|
|
|
|
}
|
|
|
|
|
|
return region
|
|
|
|
|
|
}
|
2024-05-21 04:06:13 +00:00
|
|
|
|
|
|
|
|
|
|
func GetOutBoundIP() string {
|
|
|
|
|
|
conn, err := net.Dial("udp", "8.8.8.8:53")
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return "0.0.0.0"
|
|
|
|
|
|
}
|
|
|
|
|
|
localAddr := conn.LocalAddr().(*net.UDPAddr)
|
|
|
|
|
|
ip := strings.Split(localAddr.String(), ":")[0]
|
|
|
|
|
|
return ip
|
|
|
|
|
|
}
|