dialer.go 1.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  1. package kcp
  2. import (
  3. "net"
  4. "sync/atomic"
  5. "github.com/v2ray/v2ray-core/common/dice"
  6. "github.com/v2ray/v2ray-core/common/log"
  7. v2net "github.com/v2ray/v2ray-core/common/net"
  8. "github.com/v2ray/v2ray-core/transport/internet"
  9. )
  10. var (
  11. globalConv = uint32(dice.Roll(65536))
  12. )
  13. func DialKCP(src v2net.Address, dest v2net.Destination) (internet.Connection, error) {
  14. udpDest := v2net.UDPDestination(dest.Address(), dest.Port())
  15. log.Info("KCP|Dialer: Dialing KCP to ", udpDest)
  16. conn, err := internet.DialToDest(src, udpDest)
  17. if err != nil {
  18. log.Error("KCP|Dialer: Failed to dial to dest: ", err)
  19. return nil, err
  20. }
  21. cpip, err := effectiveConfig.GetAuthenticator()
  22. if err != nil {
  23. log.Error("KCP|Dialer: Failed to create authenticator: ", err)
  24. return nil, err
  25. }
  26. conv := uint16(atomic.AddUint32(&globalConv, 1))
  27. session := NewConnection(conv, conn, conn.LocalAddr().(*net.UDPAddr), conn.RemoteAddr().(*net.UDPAddr), cpip)
  28. session.FetchInputFrom(conn)
  29. return session, nil
  30. }
  31. func init() {
  32. internet.KCPDialer = DialKCP
  33. }