00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 
00029 
00030 
00031 
00032 
00033 
00034 
00035 
00036 #if !defined(AFX_DNSMANAGER_H__4B050500_D65B_4CA1_A801_CA06418204E5__INCLUDED_)
00037 #define AFX_DNSMANAGER_H__4B050500_D65B_4CA1_A801_CA06418204E5__INCLUDED_
00038 
00039 #if _MSC_VER > 1000
00040 #pragma once
00041 #endif // _MSC_VER > 1000
00042 
00043 #pragma warning(disable:4786)
00044 
00045 #include "ErrorHandler.h"
00046 #include "PeriodicThread.h"
00047 
00048 #include "DNSAnswers.h"
00049 
00050 #include <string>
00051 #include <map>
00052 
00053 class CGenericCriticalSection;
00054 class CThreadPool;
00055 
00056 namespace KomodiaDNS
00057 {
00058 
00059 
00060 typedef enum _DnsHeaderType
00061 {
00062     dhQuestion,
00063     dhAnswer,
00064     dhAuthoritive,
00065     dhAdditional,
00066     dhNone
00067 } DnsHeaderType;
00068 
00069 
00070 #define DNS_CLASS_INTERNET 1
00071 #define DNS_CLASS_CSNET 2
00072 #define DNS_CLASS_CHAOS 3
00073 #define DNS_CLASS_HESIOD 4
00074 
00075 class CDNSSocket;
00076 class CDNSQuery;
00077 
00078 class CDNSManager : public CErrorHandler
00079 {
00080 public:
00081     friend class CDNSSocket;
00082 public:
00083     
00084     CThreadPool* GetThreadManager()const;
00085 
00086     
00087     void SetDNSTimeout(DWORD dwMS);
00088 
00089     
00090     BOOL SetConnectionTimeout(DWORD dwMS);
00091 
00092     
00093     void Uninitialize();
00094 
00095     
00096     CDNSAnswers* Receive();
00097 
00098     
00099     BOOL Initialize();
00100 
00101     
00102     BOOL IsInitialized()const;
00103 
00104     
00105     
00106     
00107     unsigned short GetDNSEntry(const std::string& rAddress,
00108                                unsigned short usID=0,
00109                                LPVOID lpLocalIDData=NULL);
00110     unsigned short GetDNSEntry(unsigned long ulAddress,
00111                                unsigned short usID=0,
00112                                LPVOID lpLocalIDData=NULL);
00113 
00114     
00115     void ParseMultithreaded(int iThreadNumber);
00116     void ParseMultithreaded(CThreadPool* pThreadManager);
00117 
00118     
00119     unsigned short QueryDNS(const CDNSQuery& rQuery,
00120                             unsigned short usID=0,
00121                             LPVOID lpLocalIDData=NULL);
00122 
00123     
00124     static std::string ParseAddress(const std::string& rAddress);
00125 
00126     
00127     
00128     
00129     
00130     CDNSManager(const std::string strDNSServer,
00131                 BOOL bTCP,
00132                 BOOL bAsync,
00133                 BOOL bAsyncConnect=FALSE);
00134     virtual ~CDNSManager();
00135 protected:
00136     
00137     virtual LPDnsHeaderHeader GetDNSHeaderHeader(unsigned short usID,
00138                                                  unsigned short usFlags,
00139                                                  unsigned short usQuestions,
00140                                                  unsigned short usAnswers=0)const;
00141 
00142     
00143     virtual void OnDNSError(int iErrorCode,
00144                             LPVOID lpLocalIDData);
00145     virtual void OnDNSTimeout(const CDNSQuery& rQuery,
00146                               LPVOID lpLocalIDData);
00147     virtual void OnDNSReceive(CDNSAnswers* pAnswers,
00148                               LPVOID lpLocalIDData);
00149 private:
00150     
00151     typedef struct _DNSData
00152     {
00153         CDNSQuery   aQuery;
00154         LPVOID      lpData;
00155         DWORD       dwTime;
00156         DWORD       dwTimedoutTime;
00157         DWORD       dwTimeout;
00158         BOOL        bTimedout;
00159         BOOL        bNotified;
00160     } DNSData;
00161 
00162     
00163     typedef std::map<unsigned short,DNSData> IDMap;
00164 private:
00165     
00166     CDNSManager(const CDNSManager& rManager);
00167 
00168     
00169     CDNSManager& operator=(const CDNSManager& rManager);
00170 
00171     
00172     void OnDNSReceive(CDNSAnswers* pAnswers);
00173 
00174     
00175     void AddRecord(unsigned short usID,
00176                    LPVOID lpLocalIDData,
00177                    DWORD dwTimeout,
00178                    const CDNSQuery& rQuery);
00179 
00180     
00181     LPVOID GetRecord(unsigned short usID)const;
00182 
00183     
00184     void RemoveRecord(unsigned short usID);
00185 
00186     
00187     BOOL WasTimedout(unsigned short usID);
00188 
00189     
00190     static BOOL ThreadProc(CPeriodicThread::ThreadStage aStage,
00191                            LPVOID lpData);
00192 
00193     
00194     IDMap m_aData;
00195 
00196     
00197     BOOL m_bAsync;
00198     BOOL m_bTCP;
00199 
00200     
00201     CDNSSocket* m_pSocket;
00202 
00203     
00204     std::string m_strDNSServer;
00205 
00206     
00207     int m_iParseThreads;
00208 
00209     
00210     CGenericCriticalSection* m_pCSection;
00211 
00212     
00213     BOOL m_bInitialized;
00214 
00215     
00216     CPeriodicThread* m_pThread;
00217 
00218     
00219     DWORD m_dwTimeout;
00220 };
00221 
00222 
00223 }
00224 
00225 #endif // !defined(AFX_DNSMANAGER_H__4B050500_D65B_4CA1_A801_CA06418204E5__INCLUDED_)