socks5_helper.go 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  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 address.Family() {
  15. case v2net.AddressFamilyIPv4:
  16. request = append(request, byte(0x01))
  17. request = append(request, address.IP()...)
  18. case v2net.AddressFamilyIPv6:
  19. request = append(request, byte(0x04))
  20. request = append(request, address.IP()...)
  21. case v2net.AddressFamilyDomain:
  22. request = append(request, byte(0x03), byte(len(address.Domain())))
  23. request = append(request, []byte(address.Domain())...)
  24. }
  25. return request
  26. }
  27. func socks5Request(command byte, address v2net.Destination) []byte {
  28. request := []byte{socks5Version, command, 0}
  29. request = appendAddress(request, address.Address())
  30. request = address.Port().Bytes(request)
  31. return request
  32. }
  33. func socks5UDPRequest(address v2net.Destination, payload []byte) []byte {
  34. request := make([]byte, 0, 1024)
  35. request = append(request, 0, 0, 0)
  36. request = appendAddress(request, address.Address())
  37. request = address.Port().Bytes(request)
  38. request = append(request, payload...)
  39. return request
  40. }