支持国标级联

This commit is contained in:
yangjiechina
2024-10-22 11:23:43 +08:00
parent e19a8708bd
commit 9090e28077
49 changed files with 1437 additions and 805 deletions

50
stream/sink_utils.go Normal file
View File

@@ -0,0 +1,50 @@
package stream
import (
"encoding/binary"
"net"
"strconv"
)
// SinkID IPV4使用uint64、IPV6使用string作为ID类型
type SinkID interface{}
type IPV4SinkID uint64
type IPV6SinkID string
func ipv4Addr2UInt64(ip uint32, port int) uint64 {
return (uint64(ip) << 32) | uint64(port)
}
// NetAddr2SinkId 根据网络地址生成SinkId IPV4使用一个uint64, IPV6使用String
func NetAddr2SinkId(addr net.Addr) SinkID {
network := addr.Network()
if "tcp" == network {
to4 := addr.(*net.TCPAddr).IP.To4()
var intIP uint32
if to4 != nil {
intIP = binary.BigEndian.Uint32(to4)
}
return ipv4Addr2UInt64(intIP, addr.(*net.TCPAddr).Port)
} else if "udp" == network {
to4 := addr.(*net.UDPAddr).IP.To4()
var intIP uint32
if to4 != nil {
intIP = binary.BigEndian.Uint32(to4)
}
return ipv4Addr2UInt64(intIP, addr.(*net.UDPAddr).Port)
}
return addr.String()
}
func SinkId2String(id SinkID) string {
if i, ok := id.(uint64); ok {
return strconv.FormatUint(i, 10)
}
return id.(string)
}