dialer.go 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. package kcp
  2. import (
  3. "crypto/tls"
  4. "net"
  5. "sync/atomic"
  6. "v2ray.com/core/common/dice"
  7. "v2ray.com/core/common/log"
  8. v2net "v2ray.com/core/common/net"
  9. "v2ray.com/core/transport/internet"
  10. v2tls "v2ray.com/core/transport/internet/tls"
  11. )
  12. var (
  13. globalConv = uint32(dice.Roll(65536))
  14. )
  15. func DialKCP(src v2net.Address, dest v2net.Destination, options internet.DialerOptions) (internet.Connection, error) {
  16. dest.Network = v2net.Network_UDP
  17. log.Info("KCP|Dialer: Dialing KCP to ", dest)
  18. conn, err := internet.DialToDest(src, dest)
  19. if err != nil {
  20. log.Error("KCP|Dialer: Failed to dial to dest: ", err)
  21. return nil, err
  22. }
  23. networkSettings, err := options.Stream.GetEffectiveNetworkSettings()
  24. if err != nil {
  25. log.Error("KCP|Dialer: Failed to get KCP settings: ", err)
  26. return nil, err
  27. }
  28. kcpSettings := networkSettings.(*Config)
  29. cpip, err := kcpSettings.GetAuthenticator()
  30. if err != nil {
  31. log.Error("KCP|Dialer: Failed to create authenticator: ", err)
  32. return nil, err
  33. }
  34. conv := uint16(atomic.AddUint32(&globalConv, 1))
  35. session := NewConnection(conv, conn, conn.LocalAddr().(*net.UDPAddr), conn.RemoteAddr().(*net.UDPAddr), cpip, kcpSettings)
  36. session.FetchInputFrom(conn)
  37. var iConn internet.Connection
  38. iConn = session
  39. if options.Stream != nil && options.Stream.SecurityType == internet.SecurityType_TLS {
  40. securitySettings, err := options.Stream.GetEffectiveSecuritySettings()
  41. if err != nil {
  42. log.Error("KCP|Dialer: Failed to apply TLS config: ", err)
  43. return nil, err
  44. }
  45. config := securitySettings.(*v2tls.Config).GetTLSConfig()
  46. if dest.Address.Family().IsDomain() {
  47. config.ServerName = dest.Address.Domain()
  48. }
  49. tlsConn := tls.Client(conn, config)
  50. iConn = v2tls.NewConnection(tlsConn)
  51. }
  52. return iConn, nil
  53. }
  54. func init() {
  55. internet.KCPDialer = DialKCP
  56. }