diff --git a/internal/logic/p2p/client.go b/internal/logic/p2p/client.go index c960cd2..ddb8176 100644 --- a/internal/logic/p2p/client.go +++ b/internal/logic/p2p/client.go @@ -178,6 +178,7 @@ func (s *sP2P) register() error { addrs[i] = addr.String() } + ports, _ := s.getLocalTCPPorts(s.client.host) // 构建注册消息 msg := GatewayMessage{ Type: MsgTypeRegister, @@ -185,6 +186,7 @@ func (s *sP2P) register() error { Data: gjson.MustEncode(g.Map{ "peer_id": s.client.host.ID().String(), "addrs": addrs, + "ports": ports, }), } diff --git a/internal/logic/p2p/gateway.go b/internal/logic/p2p/gateway.go index 608f5ac..50eea5d 100644 --- a/internal/logic/p2p/gateway.go +++ b/internal/logic/p2p/gateway.go @@ -4,6 +4,7 @@ import ( "context" "encoding/json" "fmt" + "net" "strings" "time" @@ -104,6 +105,7 @@ func (s *sP2P) handleRegister(ctx context.Context, conn *websocket.Conn, msg *Ga var data struct { PeerID string `json:"peer_id"` Addrs []string `json:"addrs"` + Ports []int `json:"ports"` } 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 } - //// 追加公网ip - //publicIp, _, _ := net.SplitHostPort(conn.RemoteAddr().String()) - //ParseIP := net.ParseIP(publicIp) - //var ipType string - //if ParseIP.To4() != nil { - // ipType = "ip4" - //} else { - // ipType = "ip6" - //} + // 追加公网ip + publicIp, _, _ := net.SplitHostPort(conn.RemoteAddr().String()) + ParseIP := net.ParseIP(publicIp) + var ipType string + if ParseIP.To4() != nil { + ipType = "ip4" + } else { + ipType = "ip6" + } //port2 := 53533 - //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)) + for _, port2 := range data.Ports { + 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) diff --git a/internal/logic/p2p/p2p.go b/internal/logic/p2p/p2p.go index 200394f..c75475e 100644 --- a/internal/logic/p2p/p2p.go +++ b/internal/logic/p2p/p2p.go @@ -6,7 +6,6 @@ import ( "fmt" "math/rand" "net" - "net/http" "strings" "sync" "time" @@ -80,46 +79,6 @@ func init() { 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结果) func (s *sP2P) GetIPv4PublicIP() (string, error) { ctx := gctx.New()