feat(route): add bind address support for TCP/UDP routes

- Introduced a new `Bind` field in the route configuration to specify the address to listen on for TCP and UDP routes.
- Defaulted the bind address to "0.0.0.0" if not provided.
- Enhanced validation to ensure the bind address is a valid IP.
- Updated stream initialization to use the correct network type (tcp4/tcp6 or udp4/udp6) based on the bind address.
- Refactored stream creation functions to accept the network type as a parameter.
This commit is contained in:
yusing
2026-01-07 15:05:55 +08:00
parent 9205af3a4f
commit 25ceb512b4
6 changed files with 66 additions and 21 deletions

View File

@@ -14,6 +14,7 @@ import (
)
type TCPTCPStream struct {
network string
listener net.Listener
laddr *net.TCPAddr
dst *net.TCPAddr
@@ -24,21 +25,21 @@ type TCPTCPStream struct {
closed atomic.Bool
}
func NewTCPTCPStream(listenAddr, dstAddr string) (nettypes.Stream, error) {
dst, err := net.ResolveTCPAddr("tcp", dstAddr)
func NewTCPTCPStream(network, listenAddr, dstAddr string) (nettypes.Stream, error) {
dst, err := net.ResolveTCPAddr(network, dstAddr)
if err != nil {
return nil, err
}
laddr, err := net.ResolveTCPAddr("tcp", listenAddr)
laddr, err := net.ResolveTCPAddr(network, listenAddr)
if err != nil {
return nil, err
}
return &TCPTCPStream{laddr: laddr, dst: dst}, nil
return &TCPTCPStream{network: network, laddr: laddr, dst: dst}, nil
}
func (s *TCPTCPStream) ListenAndServe(ctx context.Context, preDial, onRead nettypes.HookFunc) {
var err error
s.listener, err = net.ListenTCP("tcp", s.laddr)
s.listener, err = net.ListenTCP(s.network, s.laddr)
if err != nil {
logErr(s, err, "failed to listen")
return

View File

@@ -17,7 +17,7 @@ import (
)
type UDPUDPStream struct {
name string
network string
listener net.PacketConn
laddr *net.UDPAddr
@@ -51,25 +51,26 @@ const (
var bufPool = synk.GetSizedBytesPool()
func NewUDPUDPStream(listenAddr, dstAddr string) (nettypes.Stream, error) {
dst, err := net.ResolveUDPAddr("udp", dstAddr)
func NewUDPUDPStream(network, listenAddr, dstAddr string) (nettypes.Stream, error) {
dst, err := net.ResolveUDPAddr(network, dstAddr)
if err != nil {
return nil, err
}
laddr, err := net.ResolveUDPAddr("udp", listenAddr)
laddr, err := net.ResolveUDPAddr(network, listenAddr)
if err != nil {
return nil, err
}
return &UDPUDPStream{
laddr: laddr,
dst: dst,
conns: make(map[string]*udpUDPConn),
network: network,
laddr: laddr,
dst: dst,
conns: make(map[string]*udpUDPConn),
}, nil
}
func (s *UDPUDPStream) ListenAndServe(ctx context.Context, preDial, onRead nettypes.HookFunc) {
var err error
s.listener, err = net.ListenUDP("udp", s.laddr)
s.listener, err = net.ListenUDP(s.network, s.laddr)
if err != nil {
logErr(s, err, "failed to listen")
return
@@ -114,9 +115,6 @@ func (s *UDPUDPStream) LocalAddr() net.Addr {
func (s *UDPUDPStream) MarshalZerologObject(e *zerolog.Event) {
e.Str("protocol", "udp-udp")
if s.name != "" {
e.Str("name", s.name)
}
if s.dst != nil {
e.Str("dst", s.dst.String())
}