DnsResolver.hxx
上传用户:sy_wanhua
上传日期:2013-07-25
资源大小:3048k
文件大小:7k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

C/C++

  1. #ifndef DnsResolver_H
  2. #define DnsResolver_H
  3. /* ====================================================================
  4.  * The Vovida Software License, Version 1.0 
  5.  * 
  6.  * Copyright (c) 2000 Vovida Networks, Inc.  All rights reserved.
  7.  * 
  8.  * Redistribution and use in source and binary forms, with or without
  9.  * modification, are permitted provided that the following conditions
  10.  * are met:
  11.  * 
  12.  * 1. Redistributions of source code must retain the above copyright
  13.  *    notice, this list of conditions and the following disclaimer.
  14.  * 
  15.  * 2. Redistributions in binary form must reproduce the above copyright
  16.  *    notice, this list of conditions and the following disclaimer in
  17.  *    the documentation and/or other materials provided with the
  18.  *    distribution.
  19.  * 
  20.  * 3. The names "VOCAL", "Vovida Open Communication Application Library",
  21.  *    and "Vovida Open Communication Application Library (VOCAL)" must
  22.  *    not be used to endorse or promote products derived from this
  23.  *    software without prior written permission. For written
  24.  *    permission, please contact vocal@vovida.org.
  25.  *
  26.  * 4. Products derived from this software may not be called "VOCAL", nor
  27.  *    may "VOCAL" appear in their name, without prior written
  28.  *    permission of Vovida Networks, Inc.
  29.  * 
  30.  * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED
  31.  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  32.  * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND
  33.  * NON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL VOVIDA
  34.  * NETWORKS, INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT DAMAGES
  35.  * IN EXCESS OF 1,000, NOR FOR ANY INDIRECT, INCIDENTAL, SPECIAL,
  36.  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
  37.  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
  38.  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
  39.  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  40.  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
  41.  * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
  42.  * DAMAGE.
  43.  * 
  44.  * ====================================================================
  45.  * 
  46.  * This software consists of voluntary contributions made by Vovida
  47.  * Networks, Inc. and many individuals on behalf of Vovida Networks,
  48.  * Inc.  For more information on Vovida Networks, Inc., please see
  49.  * <http://www.vovida.org/>.
  50.  *
  51.  */
  52. static const char* const DnsResolver_hxx_Version =
  53.     "$Id: DnsResolver.hxx,v 1.2 2001/04/20 21:00:32 wbreu Exp $";
  54. //
  55. //  Wrapper for DNS SRV (Server Selection) or A Record
  56. #if defined(__sparc)|| defined(__SUNPRO_CC)
  57. #if !defined(MAXHOSTNAMELEN)
  58. #include <netdb.h>
  59. #if !defined(MAXHOSTNAMELEN)
  60. #define MAXHOSTNAMELEN 64
  61. #endif // !defined(MAXHOSTNAMELEN)
  62. #endif // !defined(MAXHOSTNAMELEN)
  63. #endif // defined(__sparc)
  64. #include <cstdlib>
  65. #include <cstdio>
  66. #include <stdio.h>
  67. #ifdef __linux__
  68. #include <getopt.h>
  69. #endif
  70. #include "sys/types.h"
  71. #include "netinet/in.h"
  72. #include "netdb.h"
  73. #include "errno.h"
  74. #include "arpa/nameser.h"
  75. // need the following, else got:
  76. // src/include/resolv.h:119: invalid exception specifications error
  77. #undef __P
  78. #define __P(args) args
  79. #include <resolv.h>
  80. #include <arpa/inet.h>
  81. #include <vector>
  82. #include <algorithm>
  83. #include "Sptr.hxx"
  84. #include "DnsRecord.hxx"
  85. #include "cpLog.h"
  86. #define PARM1SIZE 128
  87. #define PARM2SIZE 1024
  88. class DnsResolver
  89. {
  90.     typedef vector < Sptr < DnsRecord > >  VECTOR_DNS;
  91.     private:
  92.     ///
  93.     bool     myReady;       // is this object ready to be used?
  94.     int      myNumDns;      // # of Dns records matching the QName
  95. int      myCurIdx;      // current index to myVDns records
  96. int      myQType;       // qualified record type: srv or A record
  97.     string   myQName;       // qualified service.protocol.domain name
  98.     string   myTarget;      // domain name
  99.     VECTOR_DNS     myVDns;
  100.     public:
  101.     /// constructor - for testing purposes
  102.     DnsResolver( const char * target);
  103. /**
  104.  *  target - e.g. vovida.org
  105.  *  qType - ns_t_a (A record lookup) or ns_t_srv (SRV record)
  106.  *  serviceType - e.g. _sip, OK to be null
  107.  *  protocol - e.g. _udp, OK to be null
  108.      *  (For SRV record type, a qualified name will be built using
  109.      *  "serviceType"."protocol"."target" format)
  110.  */
  111. DnsResolver(const char * target,int qType, 
  112.                 const char * serviceType, const char * protocol);
  113.     /// destructor
  114.     virtual ~DnsResolver();
  115. /// 
  116. bool isReady() const  { return myReady; }
  117. ///
  118. int getNumDnsRecords() const { return myNumDns; }
  119. /// do a ns lookup and store result, if any, in myVDns
  120. void dnsLookUp();
  121. /** do server selection base on the list of servers already
  122.     cached locally
  123.  */
  124. void reOrder();  
  125.     
  126.     /** return a reference to a DnsRecord given an index, does not
  127.      *  affect/ update myCurIdx
  128.      *  returns myVDns.end() if idx is out of bound
  129.      */
  130.     VECTOR_DNS::iterator getRecord( int idx );
  131. /** like an iterator, locate the next record in myVDns using
  132.  *  myCurIdx is an index to the vector of Dns records
  133.  */
  134. bool getNextRecord( DnsRecord& rec );
  135.     /** select a DnsRecord based on the callID
  136.      */
  137.     bool selectRecord( const string& callId, DnsRecord& rec );
  138.     /** given a DnsRecord, get the hostname for the domain in the record:
  139.      *  (uses NetworkAddress)
  140.      */
  141. int getHostByRecord( const DnsRecord& rec, struct hostent* hEnt,
  142.      char* buf, int buflen );
  143. /// remove DNS records pointed by myVDns
  144. void clear();
  145. /// display dns record error
  146. void nsError( int error, const char* domain );
  147. // for debugging only
  148. void addSrvRecord( int prio, int wt, int port, const string& name ) {
  149.         Sptr < DnsRecord > rec = new DnsRecord;
  150.     assert (rec != 0);
  151. rec->setQtype( ns_t_srv );
  152.     rec->setPriority( prio );
  153.     rec->setWeight( wt );
  154.     rec->setPort( port );
  155.     rec->setTarget( name );
  156.     myVDns.push_back( rec );
  157.     myNumDns++;
  158.     myReady = true;   
  159. }
  160.     /// sort list by priority (lowest number first)
  161.     void sortByPreference( );
  162. /// clone a copy of the srv vector:
  163. bool cloneVSrv( VECTOR_DNS& localDns ) { return false; }
  164.     /// 
  165.     void print(int logLevel );
  166. ///
  167. void printTally( );      // used for debugging only
  168.     protected:
  169.     /**  request NameServer to return records matching the given domain, 
  170.  *   called by dnsLookUp()
  171.  */
  172.     bool findRecords( void );
  173.     /// invoked by dnsLookUp()
  174.     void loadBalance(void );
  175. ///
  176. void buildRecords( ns_msg handle, ns_sect section, int responseLen);
  177. ///
  178. void buildSRVRecords( ns_msg handle, ns_sect section, int responseLen,
  179.                           int numRecords);
  180. ///
  181. void buildARecords( ns_msg handle, ns_sect section, int responseLen,
  182.                         int numRecords);
  183. /// sort range of same priority by a random weight factor
  184.     void sortByWeight( int startIdx, int endIdx );
  185.     const u_char * expandName(const u_char *cp, const u_char *msg,
  186.                                char *name, int namelen);
  187. /// locate a set of records that shares the same priority value
  188.     int findPriorityRange( int startIdx );
  189. /// calculate the sum of the weights within the given range
  190.     int addWeights( int startIdx, int endIdx );
  191. };
  192. #endif //DnsResolver_H