dialer.go 1.5 KB

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