fix: 添加relay日志

This commit is contained in:
2026-03-28 15:28:19 +08:00
parent 581c52f9b5
commit 17122f6e4c
8 changed files with 179 additions and 27 deletions

View File

@@ -196,15 +196,26 @@ func generateKCPConversationID() (uint32, error) {
return convID, nil
}
func listenKCPPacketConn(listenAddr, bindDevice string, logger KCPPacketDebugLogger, nodeRole, nodeID string) (net.PacketConn, error) {
// ResolveUDPListenConfig parses a UDP listen address and returns the socket
// family that should be used for binding it.
func ResolveUDPListenConfig(listenAddr string) (string, *net.UDPAddr, error) {
udpAddr, err := net.ResolveUDPAddr("udp", listenAddr)
if err != nil {
return "", nil, fmt.Errorf("transport: resolve udp listen addr %s: %w", listenAddr, err)
}
return udpListenNetwork(udpAddr), udpAddr, nil
}
func listenKCPPacketConn(listenAddr, bindDevice string, logger KCPPacketDebugLogger, nodeRole, nodeID string) (net.PacketConn, error) {
network, udpAddr, err := ResolveUDPListenConfig(listenAddr)
if err != nil {
return nil, fmt.Errorf("transport: resolve kcp listen addr %s: %w", listenAddr, err)
}
rawConn, err := listenUDPConn("udp", udpAddr, bindDevice)
rawConn, err := listenUDPConn(network, udpAddr, bindDevice)
if err != nil {
return nil, fmt.Errorf("transport: listen udp for kcp on %s: %w", listenAddr, err)
return nil, fmt.Errorf("transport: listen %s for kcp on %s: %w", network, udpListenAddr(udpAddr), err)
}
packetConn, err := newKCPPacketConn(rawConn, logger, nodeRole, nodeID)
@@ -280,3 +291,13 @@ func udpListenAddr(addr *net.UDPAddr) string {
}
return addr.String()
}
func udpListenNetwork(addr *net.UDPAddr) string {
if addr == nil || addr.IP == nil {
return "udp"
}
if addr.IP.To4() != nil {
return "udp4"
}
return "udp6"
}

View File

@@ -204,6 +204,55 @@ func TestKCPCloseIsIdempotent(t *testing.T) {
}
}
func TestResolveUDPListenConfigSelectsSocketFamily(t *testing.T) {
tests := []struct {
name string
listenAddr string
wantNetwork string
wantAddr string
}{
{
name: "ipv4 unspecified",
listenAddr: "0.0.0.0:10909",
wantNetwork: "udp4",
wantAddr: "0.0.0.0:10909",
},
{
name: "ipv4 loopback",
listenAddr: "127.0.0.1:10909",
wantNetwork: "udp4",
wantAddr: "127.0.0.1:10909",
},
{
name: "ipv6 loopback",
listenAddr: "[::1]:10909",
wantNetwork: "udp6",
wantAddr: "[::1]:10909",
},
{
name: "host omitted",
listenAddr: ":10909",
wantNetwork: "udp",
wantAddr: ":10909",
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
gotNetwork, gotAddr, err := ResolveUDPListenConfig(tt.listenAddr)
if err != nil {
t.Fatalf("ResolveUDPListenConfig(%q) error = %v", tt.listenAddr, err)
}
if gotNetwork != tt.wantNetwork {
t.Fatalf("network = %q, want %q", gotNetwork, tt.wantNetwork)
}
if gotAddr.String() != tt.wantAddr {
t.Fatalf("addr = %q, want %q", gotAddr.String(), tt.wantAddr)
}
})
}
}
func newKCPConnPair(t *testing.T, senderOpts []KCPOption, receiverOpts []KCPOption, senderPacketLogger KCPPacketDebugLogger, receiverPacketLogger KCPPacketDebugLogger) (*KCPConn, <-chan kcpAcceptResult, func()) {
t.Helper()