default.go 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. package dialer
  2. import (
  3. "context"
  4. "net"
  5. "time"
  6. C "github.com/sagernet/sing-box/constant"
  7. "github.com/sagernet/sing-box/option"
  8. "github.com/sagernet/sing/common/control"
  9. M "github.com/sagernet/sing/common/metadata"
  10. "github.com/database64128/tfo-go"
  11. )
  12. type DefaultDialer struct {
  13. tfo.Dialer
  14. net.ListenConfig
  15. }
  16. func NewDefault(options option.DialerOptions) *DefaultDialer {
  17. var dialer net.Dialer
  18. var listener net.ListenConfig
  19. if options.BindInterface != "" {
  20. dialer.Control = control.Append(dialer.Control, control.BindToInterface(options.BindInterface))
  21. listener.Control = control.Append(listener.Control, control.BindToInterface(options.BindInterface))
  22. }
  23. if options.RoutingMark != 0 {
  24. dialer.Control = control.Append(dialer.Control, control.RoutingMark(options.RoutingMark))
  25. listener.Control = control.Append(listener.Control, control.RoutingMark(options.RoutingMark))
  26. }
  27. if options.ReuseAddr {
  28. listener.Control = control.Append(listener.Control, control.ReuseAddr())
  29. }
  30. if options.ProtectPath != "" {
  31. dialer.Control = control.Append(dialer.Control, ProtectPath(options.ProtectPath))
  32. listener.Control = control.Append(listener.Control, ProtectPath(options.ProtectPath))
  33. }
  34. if options.ConnectTimeout != 0 {
  35. dialer.Timeout = time.Duration(options.ConnectTimeout)
  36. }
  37. return &DefaultDialer{tfo.Dialer{Dialer: dialer, DisableTFO: !options.TCPFastOpen}, listener}
  38. }
  39. func (d *DefaultDialer) DialContext(ctx context.Context, network string, address M.Socksaddr) (net.Conn, error) {
  40. return d.Dialer.DialContext(ctx, network, address.String())
  41. }
  42. func (d *DefaultDialer) ListenPacket(ctx context.Context, destination M.Socksaddr) (net.PacketConn, error) {
  43. return d.ListenConfig.ListenPacket(ctx, C.NetworkUDP, "")
  44. }
  45. func (d *DefaultDialer) Upstream() any {
  46. return &d.Dialer
  47. }