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 "TraceRouteSocket.h"
00038
00039 #include "ErrorHandlerMacros.h"
00040
00041 #ifdef _MEMORY_DEBUG
00042 #define new DEBUG_NEW
00043 #define malloc DEBUG_MALLOC
00044 static char THIS_FILE[] = __FILE__;
00045 #endif
00046
00047 KOMODIA_NAMESPACE_START
00048
00049 #define CTraceRouteSocket_Class "CTraceRouteSocket"
00050
00051 CTraceRouteSocket::CTraceRouteSocket() : CPingSocket(),
00052 m_bTraceDone(TRUE)
00053 {
00054 try
00055 {
00056
00057 SetName(CTraceRouteSocket_Class);
00058 }
00059 ERROR_HANDLER("CTraceRouteSocket")
00060 }
00061
00062 CTraceRouteSocket::~CTraceRouteSocket()
00063 {
00064 }
00065
00066 BOOL CTraceRouteSocket::IsTraceDone()const
00067 {
00068 return m_bTraceDone;
00069 }
00070
00071 BOOL CTraceRouteSocket::TraceRoute(const std::string& rDestinationAddress,
00072 DWORD dwTimeout,
00073 unsigned char ucTTL)
00074 {
00075 try
00076 {
00077 return TraceRoute(StringToLong(rDestinationAddress),
00078 dwTimeout,
00079 ucTTL);
00080 }
00081 ERROR_HANDLER_RETURN("TraceRoute",FALSE)
00082 }
00083
00084 BOOL CTraceRouteSocket::TraceRoute(IP aDestinationAddress,
00085 DWORD dwTimeout,
00086 unsigned char ucTTL)
00087 {
00088 try
00089 {
00090 if (!m_bTraceDone)
00091 return FALSE;
00092
00093
00094 m_ucTTL=1;
00095
00096
00097 m_ucMaxTTL=ucTTL;
00098
00099
00100 m_bTraceDone=FALSE;
00101
00102
00103 m_aData.clear();
00104
00105
00106 m_dwTimeout=dwTimeout;
00107
00108
00109 m_aFinalAddress=aDestinationAddress;
00110
00111
00112 return Ping(aDestinationAddress,
00113 dwTimeout);
00114 }
00115 ERROR_HANDLER_RETURN("TraceRoute",FALSE)
00116 }
00117
00118 CTraceRouteSocket::TraceRouteVector& CTraceRouteSocket::GetData()
00119 {
00120 return m_aData;
00121 }
00122
00123 void CTraceRouteSocket::TakeData(TraceRouteVector& rVector)
00124 {
00125 m_aData.swap(rVector);
00126 }
00127
00128 BOOL CTraceRouteSocket::Ping(IP aDestinationAddress,
00129 DWORD dwTimeout)
00130 {
00131 try
00132 {
00133
00134 SetTTL(m_ucTTL);
00135
00136
00137 return CPingSocket::Ping(aDestinationAddress,
00138 dwTimeout);
00139 }
00140 ERROR_HANDLER_RETURN("Ping",FALSE)
00141 }
00142
00143 void CTraceRouteSocket::PingDone(BOOL bTimeout)
00144 {
00145 try
00146 {
00147
00148 TraceRouteData aData;
00149 aData.ucTTL=m_ucTTL;
00150 aData.bTimeout=bTimeout;
00151 aData.dwElapsedTime=GetTimeElapsed();
00152
00153
00154 if (bTimeout)
00155
00156 if (m_ucTTL>m_ucMaxTTL)
00157 m_bTraceDone=TRUE;
00158 else
00159 ;
00160 else
00161 {
00162
00163 aData.aReplyingAddress=GetReplyingAddress();
00164
00165
00166 if (aData.aReplyingAddress==m_aFinalAddress)
00167 m_bTraceDone=TRUE;
00168 }
00169
00170
00171 m_aData.push_back(aData);
00172
00173
00174 TraceData(aData);
00175
00176
00177 if (m_bTraceDone ||
00178 (bTimeout &&
00179 m_ucTTL>m_ucMaxTTL))
00180
00181 TraceDone();
00182 else
00183 {
00184
00185 ++m_ucTTL;
00186
00187
00188 if (!Ping(m_aFinalAddress,
00189 m_dwTimeout))
00190 {
00191
00192 ReportError("PingDone","Failed to ping!");
00193
00194
00195 PingDone(TRUE);
00196 }
00197 }
00198 }
00199 ERROR_HANDLER("PingDone")
00200 }
00201
00202 void CTraceRouteSocket::TraceDone()
00203 {
00204 }
00205
00206 void CTraceRouteSocket::TraceData(const TraceRouteData& rData)
00207 {
00208 }
00209
00210 KOMODIA_NAMESPACE_END