Home | History | Annotate | Download | only in dns
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef NET_DNS_DNS_SOCKET_POOL_H_
      6 #define NET_DNS_DNS_SOCKET_POOL_H_
      7 
      8 #include <vector>
      9 
     10 #include "base/memory/scoped_ptr.h"
     11 #include "net/base/net_export.h"
     12 #include "net/base/net_log.h"
     13 
     14 namespace net {
     15 
     16 class ClientSocketFactory;
     17 class DatagramClientSocket;
     18 class IPEndPoint;
     19 class NetLog;
     20 class StreamSocket;
     21 
     22 // A DnsSocketPool is an abstraction layer around a ClientSocketFactory that
     23 // allows preallocation, reuse, or other strategies to manage sockets connected
     24 // to DNS servers.
     25 class NET_EXPORT_PRIVATE DnsSocketPool {
     26  public:
     27   virtual ~DnsSocketPool() { }
     28 
     29   // Creates a DnsSocketPool that implements the default strategy for managing
     30   // sockets.  (This varies by platform; see DnsSocketPoolImpl in
     31   // dns_socket_pool.cc for details.)
     32   static scoped_ptr<DnsSocketPool> CreateDefault(
     33       ClientSocketFactory* factory);
     34 
     35   // Creates a DnsSocketPool that implements a "null" strategy -- no sockets are
     36   // preallocated, allocation requests are satisfied by calling the factory
     37   // directly, and returned sockets are deleted immediately.
     38   static scoped_ptr<DnsSocketPool> CreateNull(
     39       ClientSocketFactory* factory);
     40 
     41   // Initializes the DnsSocketPool.  |nameservers| is the list of nameservers
     42   // for which the DnsSocketPool will manage sockets; |net_log| is the NetLog
     43   // used when constructing sockets with the factory.
     44   //
     45   // Initialize may not be called more than once, and must be called before
     46   // calling AllocateSocket or FreeSocket.
     47   virtual void Initialize(
     48       const std::vector<IPEndPoint>* nameservers,
     49       NetLog* net_log) = 0;
     50 
     51   // Allocates a socket that is already connected to the nameserver referenced
     52   // by |server_index|.  May return a scoped_ptr to NULL if no sockets are
     53   // available to reuse and the factory fails to produce a socket (or produces
     54   // one on which Connect fails).
     55   virtual scoped_ptr<DatagramClientSocket> AllocateSocket(
     56       unsigned server_index) = 0;
     57 
     58   // Frees a socket allocated by AllocateSocket.  |server_index| must be the
     59   // same index passed to AllocateSocket.
     60   virtual void FreeSocket(
     61       unsigned server_index,
     62       scoped_ptr<DatagramClientSocket> socket) = 0;
     63 
     64   // Creates a StreamSocket from the factory for a transaction over TCP. These
     65   // sockets are not pooled.
     66   scoped_ptr<StreamSocket> CreateTCPSocket(
     67       unsigned server_index,
     68       const NetLog::Source& source);
     69 
     70  protected:
     71   DnsSocketPool(ClientSocketFactory* socket_factory);
     72 
     73   void InitializeInternal(
     74       const std::vector<IPEndPoint>* nameservers,
     75       NetLog* net_log);
     76 
     77   scoped_ptr<DatagramClientSocket> CreateConnectedSocket(
     78       unsigned server_index);
     79 
     80  private:
     81   ClientSocketFactory* socket_factory_;
     82   NetLog* net_log_;
     83   const std::vector<IPEndPoint>* nameservers_;
     84   bool initialized_;
     85 
     86   DISALLOW_COPY_AND_ASSIGN(DnsSocketPool);
     87 };
     88 
     89 } // namespace net
     90 
     91 #endif // NET_DNS_DNS_SOCKET_POOL_H_
     92