cache.cpp
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
00037
00038
00039
00040
00041 #ifdef WIN32
00042 #include <winsock2.h>
00043 #include <ws2tcpip.h>
00044 #ifdef LEGACY_WIN32
00045 #include <wspiapi.h>
00046 #endif
00047 #endif
00048
00049 #include <cstring>
00050 #include "cache.h"
00051 #include "core.h"
00052
00053 using namespace std;
00054
00055 CInfoBlock& CInfoBlock::operator=(const CInfoBlock& obj)
00056 {
00057 std::copy(obj.m_piIP, obj.m_piIP + 3, m_piIP);
00058 m_iIPversion = obj.m_iIPversion;
00059 m_ullTimeStamp = obj.m_ullTimeStamp;
00060 m_iRTT = obj.m_iRTT;
00061 m_iBandwidth = obj.m_iBandwidth;
00062 m_iLossRate = obj.m_iLossRate;
00063 m_iReorderDistance = obj.m_iReorderDistance;
00064 m_dInterval = obj.m_dInterval;
00065 m_dCWnd = obj.m_dCWnd;
00066
00067 return *this;
00068 }
00069
00070 bool CInfoBlock::operator==(const CInfoBlock& obj)
00071 {
00072 if (m_iIPversion != obj.m_iIPversion)
00073 return false;
00074
00075 else if (m_iIPversion == AF_INET)
00076 return (m_piIP[0] == obj.m_piIP[0]);
00077
00078 for (int i = 0; i < 4; ++ i)
00079 {
00080 if (m_piIP[i] != obj.m_piIP[i])
00081 return false;
00082 }
00083
00084 return true;
00085 }
00086
00087 CInfoBlock* CInfoBlock::clone()
00088 {
00089 CInfoBlock* obj = new CInfoBlock;
00090
00091 std::copy(m_piIP, m_piIP + 3, obj->m_piIP);
00092 obj->m_iIPversion = m_iIPversion;
00093 obj->m_ullTimeStamp = m_ullTimeStamp;
00094 obj->m_iRTT = m_iRTT;
00095 obj->m_iBandwidth = m_iBandwidth;
00096 obj->m_iLossRate = m_iLossRate;
00097 obj->m_iReorderDistance = m_iReorderDistance;
00098 obj->m_dInterval = m_dInterval;
00099 obj->m_dCWnd = m_dCWnd;
00100
00101 return obj;
00102 }
00103
00104 int CInfoBlock::getKey()
00105 {
00106 if (m_iIPversion == AF_INET)
00107 return m_piIP[0];
00108
00109 return m_piIP[0] + m_piIP[1] + m_piIP[2] + m_piIP[3];
00110 }
00111
00112 void CInfoBlock::convert(const sockaddr* addr, int ver, uint32_t ip[])
00113 {
00114 if (ver == AF_INET)
00115 {
00116 ip[0] = ((sockaddr_in*)addr)->sin_addr.s_addr;
00117 ip[1] = ip[2] = ip[3] = 0;
00118 }
00119 else
00120 {
00121 memcpy((char*)ip, (char*)((sockaddr_in6*)addr)->sin6_addr.s6_addr, 16);
00122 }
00123 }