服务端节点会给客户端追加公网ip

This commit is contained in:
2025-10-31 17:51:20 +08:00
parent 01cd7ae6e3
commit 7fe19d5161
3 changed files with 17 additions and 52 deletions

View File

@@ -178,6 +178,7 @@ func (s *sP2P) register() error {
addrs[i] = addr.String() addrs[i] = addr.String()
} }
ports, _ := s.getLocalTCPPorts(s.client.host)
// 构建注册消息 // 构建注册消息
msg := GatewayMessage{ msg := GatewayMessage{
Type: MsgTypeRegister, Type: MsgTypeRegister,
@@ -185,6 +186,7 @@ func (s *sP2P) register() error {
Data: gjson.MustEncode(g.Map{ Data: gjson.MustEncode(g.Map{
"peer_id": s.client.host.ID().String(), "peer_id": s.client.host.ID().String(),
"addrs": addrs, "addrs": addrs,
"ports": ports,
}), }),
} }

View File

@@ -4,6 +4,7 @@ import (
"context" "context"
"encoding/json" "encoding/json"
"fmt" "fmt"
"net"
"strings" "strings"
"time" "time"
@@ -104,6 +105,7 @@ func (s *sP2P) handleRegister(ctx context.Context, conn *websocket.Conn, msg *Ga
var data struct { var data struct {
PeerID string `json:"peer_id"` PeerID string `json:"peer_id"`
Addrs []string `json:"addrs"` Addrs []string `json:"addrs"`
Ports []int `json:"ports"`
} }
if err := json.Unmarshal(msg.Data, &data); err != nil { if err := json.Unmarshal(msg.Data, &data); err != nil {
@@ -111,18 +113,20 @@ func (s *sP2P) handleRegister(ctx context.Context, conn *websocket.Conn, msg *Ga
return return
} }
//// 追加公网ip // 追加公网ip
//publicIp, _, _ := net.SplitHostPort(conn.RemoteAddr().String()) publicIp, _, _ := net.SplitHostPort(conn.RemoteAddr().String())
//ParseIP := net.ParseIP(publicIp) ParseIP := net.ParseIP(publicIp)
//var ipType string var ipType string
//if ParseIP.To4() != nil { if ParseIP.To4() != nil {
// ipType = "ip4" ipType = "ip4"
//} else { } else {
// ipType = "ip6" ipType = "ip6"
//} }
//port2 := 53533 //port2 := 53533
//data.Addrs = append(data.Addrs, fmt.Sprintf("/%s/%s/tcp/%d", ipType, publicIp, port2)) for _, port2 := range data.Ports {
//data.Addrs = append(data.Addrs, fmt.Sprintf("/%s/%s/udp/%d/quic-v1", ipType, publicIp, port2)) data.Addrs = append(data.Addrs, fmt.Sprintf("/%s/%s/tcp/%d", ipType, publicIp, port2))
data.Addrs = append(data.Addrs, fmt.Sprintf("/%s/%s/udp/%d/quic-v1", ipType, publicIp, port2))
}
// 过滤回环地址 // 过滤回环地址
data.Addrs = s.filterLoopbackAddrs(data.Addrs) data.Addrs = s.filterLoopbackAddrs(data.Addrs)

View File

@@ -6,7 +6,6 @@ import (
"fmt" "fmt"
"math/rand" "math/rand"
"net" "net"
"net/http"
"strings" "strings"
"sync" "sync"
"time" "time"
@@ -80,46 +79,6 @@ func init() {
ip, _ = service.P2P().GetIPv4PublicIP() ip, _ = service.P2P().GetIPv4PublicIP()
} }
// 获取公网IP并判断类型ipv4/ipv6
func (s *sP2P) getPublicIPAndType() (ip string, ipType string, err error) {
// 公网IP查询接口多个备用
client := http.Client{Timeout: 5 * time.Second}
for _, api := range ipAPIs {
resp, err := client.Get(api)
if err != nil {
continue
}
defer resp.Body.Close()
// 读取响应纯IP字符串
buf := make([]byte, 128)
n, err := resp.Body.Read(buf)
if err != nil {
continue
}
ip = strings.TrimSpace(string(buf[:n]))
if ip == "" {
continue
}
// 判断IP类型
parsedIP := net.ParseIP(ip)
if parsedIP == nil {
continue // 无效IP格式
}
if parsedIP.To4() != nil {
return ip, "ipv4", nil // IPv4
} else if parsedIP.To16() != nil {
return ip, "ipv6", nil // IPv6
}
}
return "", "", fmt.Errorf("所有公网IP查询接口均失败")
}
// 只获取IPv4公网IP过滤IPv6结果 // 只获取IPv4公网IP过滤IPv6结果
func (s *sP2P) GetIPv4PublicIP() (string, error) { func (s *sP2P) GetIPv4PublicIP() (string, error) {
ctx := gctx.New() ctx := gctx.New()