sing/common/network/dialer.go
2024-11-14 17:49:49 +08:00

42 lines
1.3 KiB
Go

package network
import (
"context"
"net"
"net/netip"
M "github.com/sagernet/sing/common/metadata"
)
type Dialer interface {
DialContext(ctx context.Context, network string, destination M.Socksaddr) (net.Conn, error)
ListenPacket(ctx context.Context, destination M.Socksaddr) (net.PacketConn, error)
}
type PayloadDialer interface {
DialPayloadContext(ctx context.Context, network string, destination M.Socksaddr, payload [][]byte) (net.Conn, error)
}
type ParallelDialer interface {
Dialer
DialParallel(ctx context.Context, network string, destination M.Socksaddr, destinationAddresses []netip.Addr) (net.Conn, error)
}
var SystemDialer ParallelDialer = &DefaultDialer{}
type DefaultDialer struct {
net.Dialer
net.ListenConfig
}
func (d *DefaultDialer) DialContext(ctx context.Context, network string, destination M.Socksaddr) (net.Conn, error) {
return d.Dialer.DialContext(ctx, network, destination.String())
}
func (d *DefaultDialer) ListenPacket(ctx context.Context, destination M.Socksaddr) (net.PacketConn, error) {
return d.ListenConfig.ListenPacket(ctx, "udp", "")
}
func (d *DefaultDialer) DialParallel(ctx context.Context, network string, destination M.Socksaddr, destinationAddresses []netip.Addr) (net.Conn, error) {
return DialParallel(ctx, d, network, destination, destinationAddresses, false, 0)
}