本文整理汇总了C++中CUInt128::Xor方法的典型用法代码示例。如果您正苦于以下问题:C++ CUInt128::Xor方法的具体用法?C++ CUInt128::Xor怎么用?C++ CUInt128::Xor使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类CUInt128
的用法示例。
在下文中一共展示了CUInt128::Xor方法的3个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: DbgWriteBootstrapFile
void CRoutingZone::DbgWriteBootstrapFile()
{
DebugLogWarning(_T("Writing special bootstrap nodes.dat - not intended for normal use"));
try
{
// Write a saved contact list.
CUInt128 uID;
CSafeBufferedFile file;
CFileException fexp;
if (file.Open(m_sFilename, CFile::modeWrite | CFile::modeCreate | CFile::typeBinary|CFile::shareDenyWrite, &fexp))
{
setvbuf(file.m_pStream, NULL, _IOFBF, 32768);
// The bootstrap method gets a very nice sample of contacts to save.
ContactMap mapContacts;
CUInt128 uRandom(CUInt128((ULONG)0), 0);
CUInt128 uDistance = uRandom;
uDistance.Xor(uMe);
GetClosestTo(2, uRandom, uDistance, 1200, &mapContacts, false, false);
// filter out Kad1 nodes
for (ContactMap::iterator itContactMap = mapContacts.begin(); itContactMap != mapContacts.end(); )
{
ContactMap::iterator itCurContactMap = itContactMap;
++itContactMap;
CContact* pContact = itCurContactMap->second;
if (pContact->GetVersion() <= 1)
mapContacts.erase(itCurContactMap);
}
// Start file with 0 to prevent older clients from reading it.
file.WriteUInt32(0);
// Now tag it with a version which happens to be 2 (1 till 0.48a).
file.WriteUInt32(3);
file.WriteUInt32(1); // if we would use version >=3, this would mean that this is not a normal nodes.dat
file.WriteUInt32((uint32_t)mapContacts.size());
for (ContactMap::const_iterator itContactMap = mapContacts.begin(); itContactMap != mapContacts.end(); ++itContactMap)
{
CContact* pContact = itContactMap->second;
pContact->GetClientID(&uID);
file.WriteUInt128(&uID);
file.WriteUInt32(pContact->GetIPAddress());
file.WriteUInt16(pContact->GetUDPPort());
file.WriteUInt16(pContact->GetTCPPort());
file.WriteUInt8(pContact->GetVersion());
}
file.Close();
AddDebugLogLine( false, _T("Wrote %ld contact to bootstrap file."), mapContacts.size());
}
else
DebugLogError(_T("Unable to store Kad file: %s"), m_sFilename);
}
catch (CFileException* e)
{
e->Delete();
AddDebugLogLine(false, _T("CFileException in CRoutingZone::writeFile"));
}
}
示例2:
CContact *CRoutingZone::GetContact(const CUInt128 &uID) const
{
if (IsLeaf())
return m_pBin->GetContact(uID);
else{
CUInt128 uDistance;
CKademlia::GetPrefs()->GetKadID(&uDistance);
uDistance.Xor(uID);
return m_pSubZones[uDistance.GetBitNumber(m_uLevel)]->GetContact(uID);
}
}
示例3: ReadBootstrapNodesDat
void CRoutingZone::ReadBootstrapNodesDat(CFileDataIO& file){
// Bootstrap versions of nodes.dat files, are in the style of version 1 nodes.dats. The difference is that
// they will contain more contacts 500-1000 instead 50, and those contacts are not added into the routingtable
// but used to sent Bootstrap packets too. The advantage is that on a list with a high ratio of dead nodes,
// we will be able to bootstrap faster than on a normal nodes.dat and more important, if we would deliver
// a normal nodes.dat with eMule, those 50 nodes would be kinda DDOSed because everyone adds them to their routing
// table, while with this style, we don't actually add any of the contacts to our routing table in the end and we
// ask only one of those 1000 contacts one time (well or more untill we find an alive one).
if (!CKademlia::s_liBootstapList.IsEmpty()){
ASSERT( false );
return;
}
uint32_t uNumContacts = file.ReadUInt32();
if (uNumContacts != 0 && uNumContacts * 25 == (file.GetLength() - file.GetPosition()))
{
uint32_t uValidContacts = 0;
CUInt128 uID;
while ( uNumContacts )
{
file.ReadUInt128(&uID);
uint32_t uIP = file.ReadUInt32();
uint16_t uUDPPort = file.ReadUInt16();
uint16_t uTCPPort = file.ReadUInt16();
uint8_t uContactVersion = file.ReadUInt8();
uint32_t uhostIP = ntohl(uIP);
if (::IsGoodIPPort(uhostIP, uUDPPort))
{
if (::theApp.ipfilter->IsFiltered(uhostIP))
{
if (::thePrefs.GetLogFilteredIPs())
AddDebugLogLine(false, _T("Ignored kad contact (IP=%s:%u)--read known.dat -- - IP filter (%s)") , ipstr(uhostIP), uUDPPort, ::theApp.ipfilter->GetLastHit());
}
else if (uUDPPort == 53 && uContactVersion <= KADEMLIA_VERSION5_48a)
{
if (::thePrefs.GetLogFilteredIPs())
AddDebugLogLine(false, _T("Ignored kad contact (IP=%s:%u)--read known.dat") , ipstr(uhostIP), uUDPPort);
}
else if (uContactVersion > 1) // only kad2 nodes
{
// we want the 50 nodes closest to our own ID (provides randomness between different users and gets has good chances to get a bootstrap with close Nodes which is a nice start for our routing table)
CUInt128 uDistance = uMe;
uDistance.Xor(uID);
uValidContacts++;
// don't bother if we already have 50 and the farest distance is smaller than this contact
if (CKademlia::s_liBootstapList.GetCount() < 50 || CKademlia::s_liBootstapList.GetTail()->GetDistance() > uDistance){
// look were to put this contact into the proper position
bool bInserted = false;
CContact* pContact = new CContact(uID, uIP, uUDPPort, uTCPPort, uMe, uContactVersion, 0, false);
for (POSITION pos = CKademlia::s_liBootstapList.GetHeadPosition(); pos != NULL; CKademlia::s_liBootstapList.GetNext(pos)){
if (CKademlia::s_liBootstapList.GetAt(pos)->GetDistance() > uDistance){
CKademlia::s_liBootstapList.InsertBefore(pos, pContact);
bInserted = true;
break;
}
}
if (!bInserted){
ASSERT( CKademlia::s_liBootstapList.GetCount() < 50 );
CKademlia::s_liBootstapList.AddTail(pContact);
}
else if (CKademlia::s_liBootstapList.GetCount() > 50)
delete CKademlia::s_liBootstapList.RemoveTail();
}
}
}
uNumContacts--;
}
AddLogLine( false, GetResString(IDS_KADCONTACTSREAD), CKademlia::s_liBootstapList.GetCount());
DebugLog(_T("Loaded Bootstrap nodes.dat, selected %u out of %u valid contacts"), CKademlia::s_liBootstapList.GetCount(), uValidContacts);
}
}