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_)