package proxy import ( "context" "net" "github.com/xjasonlyu/tun2socks/v2/component/dialer" M "github.com/xjasonlyu/tun2socks/v2/metadata" "github.com/xjasonlyu/tun2socks/v2/proxy/proto" ) var _ Proxy = (*Direct)(nil) type Direct struct { *Base } func NewDirect() *Direct { return &Direct{ Base: &Base{ proto: proto.Direct, }, } } func (d *Direct) DialContext(ctx context.Context, metadata *M.Metadata) (net.Conn, error) { c, err := dialer.DialContext(ctx, "tcp", metadata.DestinationAddress()) if err != nil { return nil, err } setKeepAlive(c) return c, nil } func (d *Direct) DialUDP(*M.Metadata) (net.PacketConn, error) { pc, err := dialer.ListenPacket("udp", "") if err != nil { return nil, err } return &directPacketConn{PacketConn: pc}, nil } type directPacketConn struct { net.PacketConn } func (pc *directPacketConn) WriteTo(b []byte, addr net.Addr) (int, error) { if udpAddr, ok := addr.(*net.UDPAddr); ok { return pc.PacketConn.WriteTo(b, udpAddr) } udpAddr, err := net.ResolveUDPAddr("udp", addr.String()) if err != nil { return 0, err } return pc.PacketConn.WriteTo(b, udpAddr) }