dns.go 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. package command
  2. import (
  3. "errors"
  4. "io"
  5. v2net "github.com/v2ray/v2ray-core/common/net"
  6. "github.com/v2ray/v2ray-core/transport"
  7. )
  8. func init() {
  9. RegisterResponseCommand(2, func() Command { return new(CacheDns) })
  10. }
  11. const (
  12. typeIPv4 byte = 1
  13. typeIPv6 byte = 2
  14. )
  15. var (
  16. ErrDomainAddress = errors.New("Unexpected domain address")
  17. )
  18. // Size: 1 byte type + 4 or 16 byte IP addr
  19. type CacheDns struct {
  20. Address v2net.Address
  21. }
  22. func (this *CacheDns) Marshal(writer io.Writer) {
  23. if this.Address.IsIPv4() {
  24. writer.Write([]byte{typeIPv4})
  25. writer.Write(this.Address.IP())
  26. }
  27. if this.Address.IsIPv6() {
  28. writer.Write([]byte{typeIPv6})
  29. writer.Write(this.Address.IP())
  30. }
  31. }
  32. func (this *CacheDns) Unmarshal(data []byte) error {
  33. if len(data) == 0 {
  34. return transport.CorruptedPacket
  35. }
  36. typeIP := data[0]
  37. data = data[1:]
  38. if typeIP == typeIPv4 {
  39. if len(data) < 4 {
  40. return transport.CorruptedPacket
  41. }
  42. this.Address = v2net.IPAddress(data[0:4])
  43. return nil
  44. }
  45. if typeIP == typeIPv6 {
  46. if len(data) < 16 {
  47. return transport.CorruptedPacket
  48. }
  49. this.Address = v2net.IPAddress(data[0:16])
  50. return nil
  51. }
  52. return transport.CorruptedPacket
  53. }