⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pdns.h

📁 pwlib源码库
💻 H
字号:
/* * pdns.h * * PWLib library for DNS lookup services * * Portable Windows Library * * Copyright (c) 2003 Equivalence Pty. Ltd. * * The contents of this file are subject to the Mozilla Public License * Version 1.0 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See * the License for the specific language governing rights and limitations * under the License. * * The Original Code is Portable Windows Library. * * The Initial Developer of the Original Code is Equivalence Pty. Ltd. * * Contributor(s): ______________________________________. * * $Log: pdns.h,v $ * Revision 1.8  2004/06/24 07:36:24  csoutheren * Added definitions of T_SRV and T_NAPTR for hosts that do not have these * * Revision 1.7  2004/05/31 12:49:47  csoutheren * Added handling of unknown DNS types * * Revision 1.6  2004/05/28 06:50:42  csoutheren * Reorganised DNS functions to use templates, and exposed more internals to allow new DNS lookup types to be added * * Revision 1.5  2003/07/22 23:52:20  dereksmithies * Fix from Fabrizio Ammollo to cope with when P_DNS is disabled. Thanks! * * Revision 1.4  2003/04/16 07:02:55  robertj * Cleaned up source. * * Revision 1.3  2003/04/15 08:14:06  craigs * Added single string form of GetSRVRecords * * Revision 1.2  2003/04/15 08:06:24  craigs * Added Unix implementation * * Revision 1.1  2003/04/15 04:06:56  craigs * Initial version * */#if P_DNS#ifndef _PDNS_H#define _PDNS_H#ifdef P_USE_PRAGMA#pragma interface#endif#include <ptlib/sockets.h>#include <ptclib/random.h>#if defined(_WIN32)#  include <windns.h>#  pragma comment(lib, P_DNS_LIBRARY)#else#  define  P_HAS_RESOLVER 1         // set if using Unix-style DNS routines#  include <arpa/nameser.h>#  include <resolv.h>#  if defined(P_MACOSX) && (P_MACOSX >= 700)#    include <arpa/nameser_compat.h>#  endif#endif  // _WIN32#ifdef P_HAS_RESOLVER////////////////////////////////////////////////////////////////////////////// these classes provide an emulation of the Microsoft DNS API // on non-Window systems//#ifndef T_SRV#define T_SRV   33#endif#ifndef T_NAPTR#define T_NAPTR   35#endif#define	DNS_STATUS		int#define	DNS_TYPE_SRV		T_SRV#define	DNS_TYPE_MX		T_MX#define	DNS_TYPE_A		T_A#define	DNS_TYPE_NAPTR		T_NAPTR#define	DnsFreeRecordList	0#define	DNS_QUERY_STANDARD	0#define	DNS_QUERY_BYPASS_CACHE	0typedef struct _DnsAData {  DWORD IpAddress;} DNS_A_DATA;typedef struct {  char   pNameExchange[MAXDNAME];  WORD   wPreference;} DNS_MX_DATA;typedef struct {  char pNameHost[MAXDNAME];} DNS_PTR_DATA;typedef struct _DnsSRVData {  char   pNameTarget[MAXDNAME];  WORD   wPriority;  WORD   wWeight;  WORD   wPort;} DNS_SRV_DATA;typedef struct _DnsNULLData {  DWORD  dwByteCount;  char   data[1];} DNS_NULL_DATA;typedef struct _DnsRecordFlags{  unsigned   Section     : 2;  unsigned   Delete      : 1;  unsigned   CharSet     : 2;  unsigned   Unused      : 3;  unsigned   Reserved    : 24;} DNS_RECORD_FLAGS;typedef enum _DnsSection{  DnsSectionQuestion,  DnsSectionAnswer,  DnsSectionAuthority,  DnsSectionAddtional,} DNS_SECTION;class DnsRecord {  public:    DnsRecord * pNext;    char        pName[MAXDNAME];    WORD        wType;    WORD        wDataLength;    union {      DWORD               DW;     // flags as DWORD      DNS_RECORD_FLAGS    S;      // flags as structure    } Flags;    union {      DNS_A_DATA     A;      DNS_MX_DATA    MX;      DNS_PTR_DATA   NS;      DNS_SRV_DATA   SRV;      DNS_NULL_DATA  Null;    } Data;};typedef DnsRecord * PDNS_RECORD;extern void DnsRecordListFree(PDNS_RECORD rec, int FreeType);extern DNS_STATUS DnsQuery_A(const char * service,		      WORD requestType,		      DWORD options,		      void *,		      PDNS_RECORD * results,		      void *);#endif // P_HAS_RESOLVERnamespace PDNS {//////////////////////////////////////////////////////////////////////////////  this template automates the creation of a list of records for//  a specific type of DNS lookup//template <unsigned type, class RecordListType, class RecordType>BOOL Lookup(const PString & name, RecordListType & recordList){  if (name.IsEmpty())    return FALSE;  recordList.RemoveAll();  PDNS_RECORD results = NULL;  DNS_STATUS status = DnsQuery_A((const char *)name,                                  type,                                 DNS_QUERY_STANDARD,                                  NULL,                                  &results,                                  NULL);  if (status != 0)    return FALSE;  // find records matching the correct type  PDNS_RECORD dnsRecord = results;  while (dnsRecord != NULL) {    RecordType * record = recordList.HandleDNSRecord(dnsRecord, results);    if (record != NULL)      recordList.Append(record);    dnsRecord = dnsRecord->pNext;  }  if (results != NULL)    DnsRecordListFree(results, DnsFreeRecordList);  return recordList.GetSize() != 0;}/////////////////////////////////////////////////////////////class SRVRecord : public PObject{  PCLASSINFO(SRVRecord, PObject);  public:    SRVRecord()    { used = FALSE; }    Comparison Compare(const PObject & obj) const;    void PrintOn(ostream & strm) const;    PString            hostName;    PIPSocket::Address hostAddress;    BOOL               used;    WORD port;    WORD priority;    WORD weight;};PDECLARE_SORTED_LIST(SRVRecordList, PDNS::SRVRecord)  public:    void PrintOn(ostream & strm) const;    SRVRecord * GetFirst();    SRVRecord * GetNext();    PDNS::SRVRecord * HandleDNSRecord(PDNS_RECORD dnsRecord, PDNS_RECORD results);  protected:    PINDEX     priPos;    PWORDArray priList;};/**  * return a list of DNS SRV record with the specified service type  */inline BOOL GetRecords(const PString & service, SRVRecordList & serviceList){ return Lookup<DNS_TYPE_SRV, SRVRecordList, SRVRecord>(service, serviceList); }/**  * provided for backwards compatibility  */inline BOOL GetSRVRecords(      const PString & service,      SRVRecordList & serviceList){ return GetRecords(service, serviceList); }/**  * return a list of DNS SRV record with the specified service, type and domain  */BOOL GetSRVRecords(      const PString & service,      const PString & type,      const PString & domain,      SRVRecordList & serviceList);////////////////////////////////////////////////////////////////class MXRecord : public PObject{  PCLASSINFO(MXRecord, PObject);  public:    MXRecord()    { used = FALSE; }    Comparison Compare(const PObject & obj) const;    void PrintOn(ostream & strm) const;    PString            hostName;    PIPSocket::Address hostAddress;    BOOL               used;    WORD               preference;};PDECLARE_SORTED_LIST(MXRecordList, PDNS::MXRecord)  public:    void PrintOn(ostream & strm) const;    MXRecord * GetFirst();    MXRecord * GetNext();    PDNS::MXRecord * HandleDNSRecord(PDNS_RECORD dnsRecord, PDNS_RECORD results);  protected:    PINDEX lastIndex;};/**  * return a list of MX records for the specified domain  */inline BOOL GetRecords(      const PString & domain,      MXRecordList & serviceList){ return Lookup<DNS_TYPE_MX, MXRecordList, MXRecord>(domain, serviceList); }/**  * provided for backwards compatibility  */inline BOOL GetMXRecords(      const PString & domain,      MXRecordList & serviceList){  return GetRecords(domain, serviceList);}///////////////////////////////////////////////////////////////////////////}; // namespace PDNS#endif // _PDNS_H#endif // P_DNS// End Of File ///////////////////////////////////////////////////////////////

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -