client.go 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. package localdns
  2. import (
  3. "context"
  4. "net"
  5. "v2ray.com/core/features/dns"
  6. )
  7. // Client is an implementation of dns.Client, which queries localhost for DNS.
  8. type Client struct {
  9. resolver net.Resolver
  10. }
  11. // Type implements common.HasType.
  12. func (*Client) Type() interface{} {
  13. return dns.ClientType()
  14. }
  15. // Start implements common.Runnable.
  16. func (*Client) Start() error { return nil }
  17. // Close implements common.Closable.
  18. func (*Client) Close() error { return nil }
  19. // LookupIP implements Client.
  20. func (c *Client) LookupIP(host string) ([]net.IP, error) {
  21. ipAddr, err := c.resolver.LookupIPAddr(context.Background(), host)
  22. if err != nil {
  23. return nil, err
  24. }
  25. ips := make([]net.IP, 0, len(ipAddr))
  26. for _, addr := range ipAddr {
  27. ips = append(ips, addr.IP)
  28. }
  29. return ips, nil
  30. }
  31. func (c *Client) LookupIPv4(host string) ([]net.IP, error) {
  32. ips, err := c.LookupIP(host)
  33. if err != nil {
  34. return nil, err
  35. }
  36. var ipv4 []net.IP
  37. for _, ip := range ips {
  38. if len(ip) == net.IPv4len {
  39. ipv4 = append(ipv4, ip)
  40. }
  41. }
  42. return ipv4, nil
  43. }
  44. func (c *Client) LookupIPv6(host string) ([]net.IP, error) {
  45. ips, err := c.LookupIP(host)
  46. if err != nil {
  47. return nil, err
  48. }
  49. var ipv6 []net.IP
  50. for _, ip := range ips {
  51. if len(ip) == net.IPv6len {
  52. ipv6 = append(ipv6, ip)
  53. }
  54. }
  55. return ipv6, nil
  56. }
  57. func New() *Client {
  58. return &Client{
  59. resolver: net.Resolver{
  60. PreferGo: true,
  61. },
  62. }
  63. }