socks5_helper.go 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. package scenarios
  2. import (
  3. v2net "github.com/v2ray/v2ray-core/common/net"
  4. )
  5. const (
  6. socks5Version = byte(0x05)
  7. )
  8. func socks5AuthMethodRequest(methods ...byte) []byte {
  9. request := []byte{socks5Version, byte(len(methods))}
  10. request = append(request, methods...)
  11. return request
  12. }
  13. func appendAddress(request []byte, address v2net.Address) []byte {
  14. switch {
  15. case address.IsIPv4():
  16. request = append(request, byte(0x01))
  17. request = append(request, address.IP()...)
  18. case address.IsIPv6():
  19. request = append(request, byte(0x04))
  20. request = append(request, address.IP()...)
  21. case address.IsDomain():
  22. request = append(request, byte(0x03), byte(len(address.Domain())))
  23. request = append(request, []byte(address.Domain())...)
  24. }
  25. request = append(request, address.Port().Bytes()...)
  26. return request
  27. }
  28. func socks5Request(command byte, address v2net.Address) []byte {
  29. request := []byte{socks5Version, command, 0}
  30. request = appendAddress(request, address)
  31. return request
  32. }
  33. func socks5UDPRequest(address v2net.Address, payload []byte) []byte {
  34. request := make([]byte, 0, 1024)
  35. request = append(request, 0, 0, 0)
  36. request = appendAddress(request, address)
  37. request = append(request, payload...)
  38. return request
  39. }