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 #include "stdafx.h"
00037 #include "TraceRouteSocketReverseDNS.h"
00038
00039 #include "ErrorHandlerMacros.h"
00040 #include "OSManager.h"
00041 #include "GenericThread.h"
00042
00043 #include "DNSManager.h"
00044
00045 #ifdef _MEMORY_DEBUG
00046 #define new DEBUG_NEW
00047 #define malloc DEBUG_MALLOC
00048 static char THIS_FILE[] = __FILE__;
00049 #endif
00050
00051 KOMODIA_NAMESPACE_START
00052
00053 #define CTraceRouteSocketReverseDNS_Class "CTraceRouteSocketReverseDNS"
00054
00055 CTraceRouteSocketReverseDNS::CTraceRouteSocketReverseDNS(std::string sDNSServer,
00056 BOOL bDNSTcp,
00057 BOOL bAsync) : CTraceRouteSocket(),
00058 m_bAsync(bAsync),
00059 m_pThread(NULL),
00060 m_pDNSManager(NULL),
00061 m_bTraceDone(TRUE),
00062 m_bInitialized(FALSE)
00063 {
00064 try
00065 {
00066
00067 SetName(CTraceRouteSocketReverseDNS_Class);
00068
00069
00070 m_pDNSManager=new KomodiaDNS::CDNSManager(sDNSServer,
00071 bDNSTcp,
00072 bAsync);
00073
00074
00075 if (!(m_bInitialized=m_pDNSManager->Initialize()))
00076 ReportError("CTraceRouteSocketReverseDNS","Failed to initialize sockets!");
00077 }
00078 ERROR_HANDLER("CTraceRouteSocketReverseDNS")
00079 }
00080
00081 CTraceRouteSocketReverseDNS::CTraceRouteSocketReverseDNS(const std::string& rDNSServer,
00082 BOOL bDNSTcp) : CTraceRouteSocket(),
00083 m_bAsync(FALSE),
00084 m_pThread(NULL),
00085 m_pDNSManager(NULL),
00086 m_bTraceDone(TRUE),
00087 m_bInitialized(FALSE)
00088 {
00089 try
00090 {
00091
00092 SetName(CTraceRouteSocketReverseDNS_Class);
00093
00094
00095 m_pDNSManager=new KomodiaDNS::CDNSManager(rDNSServer,
00096 bDNSTcp,
00097 m_bAsync);
00098
00099
00100 if (!(m_bInitialized=m_pDNSManager->Initialize()))
00101 ReportError("CTraceRouteSocketReverseDNS","Failed to initialize sockets!");
00102 }
00103 ERROR_HANDLER("CTraceRouteSocketReverseDNS")
00104 }
00105
00106 CTraceRouteSocketReverseDNS::~CTraceRouteSocketReverseDNS()
00107 {
00108 try
00109 {
00110
00111 delete m_pThread;
00112
00113
00114 delete m_pDNSManager;
00115 }
00116 ERROR_HANDLER("~CTraceRouteSocketReverseDNS")
00117 }
00118
00119 void CTraceRouteSocketReverseDNS::TraceDone()
00120 {
00121 try
00122 {
00123 if (m_pThread)
00124 delete m_pThread;
00125
00126
00127 m_pThread=COSManager::CreateThread(DNSResolving);
00128 m_pThread->Start((LPVOID)this);
00129 }
00130 ERROR_HANDLER("CTraceRouteSocketReverseDNS")
00131 }
00132
00133 void CTraceRouteSocketReverseDNS::TraceData(const TraceRouteData& rData)
00134 {
00135 }
00136
00137 DWORD CTraceRouteSocketReverseDNS::DNSResolving(LPVOID lpData)
00138 {
00139 try
00140 {
00141
00142 CTraceRouteSocketReverseDNS* pClass;
00143 pClass=(CTraceRouteSocketReverseDNS*)lpData;
00144
00145
00146 TraceRouteVector aData;
00147 pClass->TakeData(aData);
00148
00149 CTraceRouteSocket::TraceRouteVector::const_iterator aIterator=aData.begin();
00150
00151
00152 while (aIterator!=aData.end())
00153 {
00154
00155 DNSTraceRouteData aDNSData;
00156 aDNSData.aReplyingAddress=aIterator->aReplyingAddress;
00157 aDNSData.bTimeout=aIterator->bTimeout;
00158 aDNSData.dwElapsedTime=aIterator->dwElapsedTime;
00159 aDNSData.ucTTL=aIterator->ucTTL;
00160
00161
00162 if (!aIterator->bTimeout)
00163 {
00164
00165 if (!pClass->m_pDNSManager->GetDNSEntry(aDNSData.aReplyingAddress))
00166 ReportStaticError(CTraceRouteSocketReverseDNS_Class,"DNSResolving","Failed to query DNS!");
00167 else
00168 {
00169
00170 KomodiaDNS::CDNSAnswers* pAnswers;
00171 pAnswers=pClass->m_pDNSManager->Receive();
00172
00173
00174 if (!pAnswers)
00175 ReportStaticError(CTraceRouteSocketReverseDNS_Class,"DNSResolving","Failed to query DNS!");
00176 else if (pAnswers->IsResolved())
00177 aDNSData.sReverseDNS=pAnswers->GetAnswer();
00178 }
00179 }
00180
00181
00182 pClass->m_aData.push_back(aDNSData);
00183
00184
00185 ++aIterator;
00186 }
00187
00188
00189 pClass->m_bTraceDone=TRUE;
00190
00191
00192 pClass->DNSTraceDone();
00193
00194
00195 return TRUE;
00196 }
00197 ERROR_HANDLER_STATIC_RETURN(CTraceRouteSocketReverseDNS_Class,"DNSResolving",THREAD_DO_NOTHING_EXIT_VALUE)
00198 }
00199
00200 void CTraceRouteSocketReverseDNS::DNSTraceDone()
00201 {
00202 }
00203
00204 BOOL CTraceRouteSocketReverseDNS::IsTraceDone()const
00205 {
00206 return m_bTraceDone;
00207 }
00208
00209 void CTraceRouteSocketReverseDNS::TakeDNSData(DNSTraceRouteVector& rVector)
00210 {
00211 try
00212 {
00213 m_aData.swap(rVector);
00214 }
00215 ERROR_HANDLER("TakeDNSData")
00216 }
00217
00218 CTraceRouteSocketReverseDNS::DNSTraceRouteVector& CTraceRouteSocketReverseDNS::GetDNSData()
00219 {
00220 return m_aData;
00221 }
00222
00223 BOOL CTraceRouteSocketReverseDNS::TraceRoute(IP aDestinationAddress,
00224 DWORD dwTimeout,
00225 unsigned char ucTTL)
00226 {
00227 try
00228 {
00229 if (!m_bInitialized)
00230 return FALSE;
00231
00232
00233 if (!m_bTraceDone)
00234 return FALSE;
00235
00236
00237 m_bTraceDone=FALSE;
00238
00239
00240 m_aData.clear();
00241
00242
00243 return CTraceRouteSocket::TraceRoute(aDestinationAddress,
00244 dwTimeout,
00245 ucTTL);
00246 }
00247 ERROR_HANDLER_RETURN("TraceRoute",FALSE)
00248 }
00249
00250 BOOL CTraceRouteSocketReverseDNS::IsInitialized()const
00251 {
00252 return m_bInitialized;
00253 }
00254
00255 KOMODIA_NAMESPACE_END