|
|
|
@ -2183,7 +2183,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv)
@@ -2183,7 +2183,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv)
|
|
|
|
|
CAddress addrFrom; |
|
|
|
|
uint64 nNonce = 1; |
|
|
|
|
vRecv >> pfrom->nVersion >> pfrom->nServices >> nTime >> addrMe; |
|
|
|
|
if (pfrom->nVersion < 209) |
|
|
|
|
if (pfrom->nVersion < MIN_PROTO_VERSION) |
|
|
|
|
{ |
|
|
|
|
// Since February 20, 2012, the protocol is initiated at version 209,
|
|
|
|
|
// and earlier versions are no longer supported
|
|
|
|
@ -2233,7 +2233,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv)
@@ -2233,7 +2233,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv)
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Get recent addresses
|
|
|
|
|
if (pfrom->nVersion >= 31402 || addrman.size() < 1000) |
|
|
|
|
if (pfrom->nVersion >= CADDR_TIME_VERSION || addrman.size() < 1000) |
|
|
|
|
{ |
|
|
|
|
pfrom->PushMessage("getaddr"); |
|
|
|
|
pfrom->fGetAddr = true; |
|
|
|
@ -2250,7 +2250,8 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv)
@@ -2250,7 +2250,8 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv)
|
|
|
|
|
// Ask the first connected node for block updates
|
|
|
|
|
static int nAskedForBlocks = 0; |
|
|
|
|
if (!pfrom->fClient && |
|
|
|
|
(pfrom->nVersion < 32000 || pfrom->nVersion >= 32400) && |
|
|
|
|
(pfrom->nVersion < NOBLKS_VERSION_START || |
|
|
|
|
pfrom->nVersion >= NOBLKS_VERSION_END) && |
|
|
|
|
(nAskedForBlocks < 1 || vNodes.size() <= 1)) |
|
|
|
|
{ |
|
|
|
|
nAskedForBlocks++; |
|
|
|
@ -2292,7 +2293,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv)
@@ -2292,7 +2293,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv)
|
|
|
|
|
vRecv >> vAddr; |
|
|
|
|
|
|
|
|
|
// Don't want addr from older versions unless seeding
|
|
|
|
|
if (pfrom->nVersion < 31402 && addrman.size() > 1000) |
|
|
|
|
if (pfrom->nVersion < CADDR_TIME_VERSION && addrman.size() > 1000) |
|
|
|
|
return true; |
|
|
|
|
if (vAddr.size() > 1000) |
|
|
|
|
{ |
|
|
|
@ -2329,7 +2330,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv)
@@ -2329,7 +2330,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv)
|
|
|
|
|
multimap<uint256, CNode*> mapMix; |
|
|
|
|
BOOST_FOREACH(CNode* pnode, vNodes) |
|
|
|
|
{ |
|
|
|
|
if (pnode->nVersion < 31402) |
|
|
|
|
if (pnode->nVersion < CADDR_TIME_VERSION) |
|
|
|
|
continue; |
|
|
|
|
unsigned int nPointer; |
|
|
|
|
memcpy(&nPointer, &pnode, sizeof(nPointer)); |
|
|
|
@ -2651,6 +2652,23 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv)
@@ -2651,6 +2652,23 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv)
|
|
|
|
|
|
|
|
|
|
else if (strCommand == "ping") |
|
|
|
|
{ |
|
|
|
|
if (pfrom->nVersion > BIP0031_VERSION) |
|
|
|
|
{ |
|
|
|
|
uint64 nonce = 0; |
|
|
|
|
vRecv >> nonce; |
|
|
|
|
// Echo the message back with the nonce. This allows for two useful features:
|
|
|
|
|
//
|
|
|
|
|
// 1) A remote node can quickly check if the connection is operational
|
|
|
|
|
// 2) Remote nodes can measure the latency of the network thread. If this node
|
|
|
|
|
// is overloaded it won't respond to pings quickly and the remote node can
|
|
|
|
|
// avoid sending us more work, like chain download requests.
|
|
|
|
|
//
|
|
|
|
|
// The nonce stops the remote getting confused between different pings: without
|
|
|
|
|
// it, if the remote node sends a ping once per second and this node takes 5
|
|
|
|
|
// seconds to respond to each, the 5th ping the remote sends would appear to
|
|
|
|
|
// return very quickly.
|
|
|
|
|
pfrom->PushMessage("pong", nonce); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -2813,9 +2831,14 @@ bool SendMessages(CNode* pto, bool fSendTrickle)
@@ -2813,9 +2831,14 @@ bool SendMessages(CNode* pto, bool fSendTrickle)
|
|
|
|
|
if (pto->nVersion == 0) |
|
|
|
|
return true; |
|
|
|
|
|
|
|
|
|
// Keep-alive ping
|
|
|
|
|
if (pto->nLastSend && GetTime() - pto->nLastSend > 30 * 60 && pto->vSend.empty()) |
|
|
|
|
pto->PushMessage("ping"); |
|
|
|
|
// Keep-alive ping. We send a nonce of zero because we don't use it anywhere
|
|
|
|
|
// right now.
|
|
|
|
|
if (pto->nLastSend && GetTime() - pto->nLastSend > 30 * 60 && pto->vSend.empty()) { |
|
|
|
|
if (pto->nVersion > BIP0031_VERSION) |
|
|
|
|
pto->PushMessage("ping", 0); |
|
|
|
|
else |
|
|
|
|
pto->PushMessage("ping"); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Resend wallet transactions that haven't gotten in a block yet
|
|
|
|
|
ResendWalletTransactions(); |
|
|
|
|