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_REALTIMETRACEROUTESOCKET_H__311D7557_488E_46B7_8DE6_594A26F57306__INCLUDED_)
00037 #define AFX_REALTIMETRACEROUTESOCKET_H__311D7557_488E_46B7_8DE6_594A26F57306__INCLUDED_
00038
00039 #if _MSC_VER > 1000
00040 #pragma once
00041 #endif // _MSC_VER > 1000
00042
00043 #include "PingSocket.h"
00044 #include "DNSManager.h"
00045
00046 #include <map>
00047
00048 KOMODIA_NAMESPACE_START
00049
00050 class CGenericCriticalSection;
00051
00052 class CRealTimeTraceRouteSocket : public CPingSocket
00053 {
00054 private:
00055
00056 class CRealTimeDNSManager : public KomodiaDNS::CDNSManager
00057 {
00058 public:
00059
00060 CRealTimeDNSManager(CRealTimeTraceRouteSocket* pFather,
00061 const std::string strDNSServer,
00062 BOOL bTCP);
00063 virtual ~CRealTimeDNSManager();
00064 protected:
00065
00066 virtual void OnDNSError(int iErrorCode,
00067 LPVOID lpLocalIDData);
00068 virtual void OnDNSTimeout(const KomodiaDNS::CDNSQuery& rQuery,
00069 LPVOID lpLocalIDData);
00070 virtual void OnDNSReceive(KomodiaDNS::CDNSAnswers* pAnswers,
00071 LPVOID lpLocalIDData);
00072 private:
00073 CRealTimeTraceRouteSocket* m_pFather;
00074 };
00075
00076 friend CRealTimeDNSManager;
00077 public:
00078
00079 typedef enum _MaxHops
00080 {
00081 mhMaxHops=40
00082 } MaxHops;
00083
00084
00085 typedef struct _TraceRouteData
00086 {
00087 std::auto_ptr<CGenericCriticalSection> pCSection;
00088 IP aReplyingAddress;
00089 unsigned char ucTTL;
00090 DWORD dwElapsedTime;
00091 std::string sReverseDNS;
00092 CRealTimeDNSManager* pDNS;
00093 BOOL bResolved;
00094 BOOL bTarget;
00095 BOOL bFinal;
00096 LPVOID lpUserData;
00097
00098
00099 _TraceRouteData& operator=(const _TraceRouteData& rData)
00100 {
00101 aReplyingAddress=rData.aReplyingAddress;
00102 bFinal=rData.bFinal;
00103 bResolved=rData.bResolved;
00104 bTarget=rData.bTarget;
00105 dwElapsedTime=rData.dwElapsedTime;
00106 lpUserData=rData.lpUserData;
00107 pDNS=rData.pDNS;
00108 ucTTL=rData.ucTTL;
00109 sReverseDNS=rData.sReverseDNS;
00110
00111
00112 return *this;
00113 }
00114 } TraceRouteData;
00115
00116
00117 typedef struct _ResolveThreadData
00118 {
00119 TraceRouteData* pData;
00120 CRealTimeTraceRouteSocket* pClass;
00121 } ResolveThreadData;
00122
00123 public:
00124
00125 void FakeLastRequest();
00126
00127
00128 void SetResolveStatus(BOOL bResolve);
00129
00130
00131 unsigned char GetMaxHops()const;
00132
00133
00134 const TraceRouteData* GetData()const;
00135
00136
00137 BOOL IsInitialized()const;
00138
00139
00140 virtual BOOL IsTraceDone()const;
00141
00142
00143 virtual BOOL TraceRoute(const std::string& rDestinationAddress,
00144 DWORD dwTimeout);
00145
00146 virtual BOOL TraceRoute(IP aDestinationAddress,
00147 DWORD dwTimeout);
00148
00149
00150 CRealTimeTraceRouteSocket(std::string sDNSServer,
00151 BOOL bDNSTcp,
00152 BOOL bMultithreaded=TRUE);
00153 virtual ~CRealTimeTraceRouteSocket();
00154 protected:
00155
00156 CRealTimeDNSManager* GetDNSManager()const;
00157
00158
00159 virtual void TraceDataForModify(TraceRouteData* pData,
00160 BOOL bResolved);
00161
00162
00163 virtual void TraceData(const TraceRouteData* pData,
00164 BOOL bResolved);
00165
00166
00167 virtual BOOL IsIDOK(unsigned short usID,
00168 unsigned short usSequence)const;
00169
00170
00171 virtual BOOL OnSocketTimeout();
00172
00173
00174 virtual void TraceDone(BOOL bError);
00175 private:
00176
00177 void DNSDone();
00178
00179
00180 void InvokeTraceDone();
00181
00182
00183 virtual void PingDoneData(IP aReplyingAddress,
00184 unsigned char ucTTL,
00185 DWORD dwTimeElapsed,
00186 int iDataSize,
00187 unsigned short usID,
00188 BOOL bTTLExpired);
00189
00190
00191 static void ResolveData(LPVOID lpData);
00192
00193
00194 void AdjustResolvers(long lAmount);
00195
00196
00197 unsigned long GetResolvers()const;
00198
00199
00200 static unsigned short GetPortStart();
00201
00202
00203 static unsigned short m_sPortStart;
00204
00205
00206 unsigned short m_usPortStart;
00207
00208
00209 TraceRouteData m_aData[mhMaxHops+1];
00210
00211
00212 BOOL m_bTraceDone;
00213
00214
00215 CRealTimeDNSManager* m_pManager;
00216
00217
00218 unsigned char m_ucMaxHOP;
00219
00220
00221 unsigned char m_ucMinHOP;
00222
00223
00224 CGenericCriticalSection* m_pCSection;
00225
00226
00227 CGenericCriticalSection* m_pCSectionResolve;
00228
00229
00230 CGenericCriticalSection* m_pCSectionGeneral;
00231
00232
00233 unsigned long m_ulResolvers;
00234
00235
00236 BOOL m_bInitialized;
00237
00238
00239 IP m_aTracedAddress;
00240
00241
00242 BOOL m_bResolveIPs;
00243
00244
00245 BOOL m_bPartialDone;
00246
00247
00248 BOOL m_bFinishing;
00249 };
00250
00251 KOMODIA_NAMESPACE_END
00252
00253 #endif // !defined(AFX_REALTIMETRACEROUTESOCKET_H__311D7557_488E_46B7_8DE6_594A26F57306__INCLUDED_)