dialer.go 1006 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. package kcp
  2. import (
  3. "errors"
  4. "math/rand"
  5. "net"
  6. v2net "github.com/v2ray/v2ray-core/common/net"
  7. "github.com/v2ray/v2ray-core/transport/internet"
  8. )
  9. var (
  10. ErrUnknownDestination = errors.New("Destination IP can't be resolved.")
  11. )
  12. func DialKCP(src v2net.Address, dest v2net.Destination) (internet.Connection, error) {
  13. var ip net.IP
  14. if dest.Address().IsDomain() {
  15. ips, err := net.LookupIP(dest.Address().Domain())
  16. if err != nil {
  17. return nil, err
  18. }
  19. if len(ips) == 0 {
  20. return nil, ErrUnknownDestination
  21. }
  22. ip = ips[0]
  23. } else {
  24. ip = dest.Address().IP()
  25. }
  26. udpAddr := &net.UDPAddr{
  27. IP: ip,
  28. Port: int(dest.Port()),
  29. }
  30. udpConn, err := net.ListenUDP("udp", &net.UDPAddr{})
  31. if err != nil {
  32. return nil, err
  33. }
  34. cpip, _ := NewNoneBlockCrypt(nil)
  35. session := newUDPSession(rand.Uint32(), nil, udpConn, udpAddr, cpip)
  36. kcvn := &KCPVconn{hc: session}
  37. err = kcvn.ApplyConf()
  38. if err != nil {
  39. return nil, err
  40. }
  41. return kcvn, nil
  42. }
  43. func init() {
  44. internet.KCPDialer = DialKCP
  45. }