code: func (d *dnsEx) Exchange(ctx context.Context, addr string, state request.Request) (*dns.Msg, error) {
  	proto := state.Proto()
  	if d.Options.ForceTCP {
  		proto = "tcp"
  	}
  	co, err := net.DialTimeout(proto, addr, d.Timeout)
  	if err != nil {
  		return nil, err
  	}
  
  	reply, _, err := d.ExchangeConn(state.Req, co)
  
  	co.Close()
  
  	if reply != nil && reply.Truncated {
  		// Suppress proxy error for truncated responses
  		err = nil
  	}
  
  	if err != nil {
  		return nil, err
  	}
  	// Make sure it fits in the DNS response.
  	reply, _ = state.Scrub(reply)
  	reply.Compress = true
  	reply.Id = state.Req.Id
  
  	return reply, nil
  }
docs: // Exchange implements the Exchanger interface.