bool RecvLine(SOCKET hSocket, string& strLine)
{
- strLine = "";
+ strLine.clear();
for ( ; ; )
{
char c;
vfReachable[NET_IPV4] = true;
}
+int GetnScore(const CService& addr)
+{
+ LOCK(cs_mapLocalHost);
+ if (mapLocalHost.count(addr) == LOCAL_NONE)
+ return 0;
+ return mapLocalHost[addr].nScore;
+}
+
+
+// Is our peer's addrLocal potentially useful as an external IP source?
+bool IsPeerAddrLocalGood(CNode *pnode)
+{
+ return fDiscover && pnode->addr.IsRoutable() && pnode->addrLocal.IsRoutable() &&
+ !IsLimited(pnode->addrLocal.GetNetwork());
+}
+
+// pushes our own address to a peer
+void AdvertiseLocal(CNode *pnode)
+{
+ if (!fNoListen && pnode->fSuccessfullyConnected)
+ {
+ CAddress addrLocal = GetLocalAddress(&pnode->addr);
+ // If discovery is enabled, sometimes give our peer the address it
+ // tells us that it sees us as in case it has a better idea of our
+ // address than we do.
+ if (IsPeerAddrLocalGood(pnode) && (!addrLocal.IsRoutable() ||
+ GetRand((GetnScore(addrLocal) > LOCAL_MANUAL) ? 8:2) == 0))
+ {
+ addrLocal.SetIP(pnode->addrLocal);
+ }
+ if (addrLocal.IsRoutable())
+ {
+ printf("AdvertiseLocal: advertising address %s\n", addrLocal.ToString().c_str());
+ pnode->PushAddress(addrLocal);
+ }
+ }
+}
+
// learn a new local address
bool AddLocal(const CService& addr, int nScore)
{
}
#undef X
-
-
-
-
+void Release(CNode* node) {
+ node->Release();
+}
}
{
LOCK(cs_vNodes);
- BOOST_FOREACH(CNode* pnode, vNodesCopy)
- pnode->Release();
+ for_each(vNodesCopy.begin(), vNodesCopy.end(), Release);
}
Sleep(10);
StartSync(vNodesCopy);
// Poll the connected nodes for messages
- CNode* pnodeTrickle = NULL;
- if (!vNodesCopy.empty())
- pnodeTrickle = vNodesCopy[GetRand(vNodesCopy.size())];
BOOST_FOREACH(CNode* pnode, vNodesCopy)
{
// Receive messages
{
TRY_LOCK(pnode->cs_vSend, lockSend);
if (lockSend)
- SendMessages(pnode, pnode == pnodeTrickle);
+ SendMessages(pnode);
}
if (fShutdown)
return;
{
LOCK(cs_vNodes);
- BOOST_FOREACH(CNode* pnode, vNodesCopy)
- pnode->Release();
+ for_each(vNodesCopy.begin(), vNodesCopy.end(), Release);
}
// Wait and allow messages to bunch up.
bool BindListenPort(const CService &addrBind, string& strError)
{
- strError = "";
+ strError.clear();
int nOne = 1;
// Create socket for listening for incoming connections
LOCK(cs_totalBytesSent);
return nTotalBytesSent;
}
+int64_t PoissonNextSend(int64_t nNow, int average_interval_seconds) {
+ return nNow + (int64_t)(log1p(GetRand(1ULL << 48) * -0.0000000000000035527136788 /* -1/2^48 */) * average_interval_seconds * -1000000.0 + 0.5);
+}