implement "addr" packet.
This commit is contained in:
parent
885c9d8e6c
commit
262507dfe0
|
@ -3457,11 +3457,58 @@ NAN_METHOD(HookPackets) {
|
||||||
o->Set(NanNew<String>("relay"), NanNew<Boolean>(fRelayTxes));
|
o->Set(NanNew<String>("relay"), NanNew<Boolean>(fRelayTxes));
|
||||||
#endif
|
#endif
|
||||||
} else if (cur->pfrom->nVersion == 0) {
|
} else if (cur->pfrom->nVersion == 0) {
|
||||||
;
|
// Must have a version message before anything else
|
||||||
|
return false;
|
||||||
} else if (strCommand == "verack") {
|
} else if (strCommand == "verack") {
|
||||||
;
|
o->Set(NanNew<String>("receiveVersion"), NanNew<Number>(min(pfrom->nVersion, PROTOCOL_VERSION)));
|
||||||
} else if (strCommand == "addr") {
|
} else if (strCommand == "addr") {
|
||||||
;
|
vector<CAddress> vAddr;
|
||||||
|
cur->vRecv >> vAddr;
|
||||||
|
|
||||||
|
// Don't want addr from older versions unless seeding
|
||||||
|
if (cur->pfrom->nVersion < CADDR_TIME_VERSION && addrman.size() > 1000) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Bad address size
|
||||||
|
if (vAddr.size() > 1000) {
|
||||||
|
return false; // ?
|
||||||
|
}
|
||||||
|
|
||||||
|
Local<Array> array = NanNew<Array>();
|
||||||
|
int i = 0;
|
||||||
|
|
||||||
|
// Get the new addresses
|
||||||
|
int64_t nNow = GetAdjustedTime();
|
||||||
|
BOOST_FOREACH(CAddress& addr, vAddr) {
|
||||||
|
// boost::this_thread::interruption_point();
|
||||||
|
|
||||||
|
unsigned int nTime = addr.nTime;
|
||||||
|
if (nTime <= 100000000 || nTime > nNow + 10 * 60) {
|
||||||
|
nTime = nNow - 5 * 24 * 60 * 60;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool fReachable = IsReachable(addr);
|
||||||
|
|
||||||
|
Local<Object> obj = NanNew<Object>();
|
||||||
|
|
||||||
|
char nServices[21] = {0};
|
||||||
|
int written = snprintf(nServices, sizeof(nServices), "%020lu", (uint64_t)addr.nServices);
|
||||||
|
assert(written == 20);
|
||||||
|
|
||||||
|
obj->Set(NanNew<String>("services"), NanNew<String>((char *)nServices));
|
||||||
|
obj->Set(NanNew<String>("time"), NanNew<Number>((unsigned int)nTime)->ToUint32());
|
||||||
|
obj->Set(NanNew<String>("last"), NanNew<Number>((int64_t)addr.nLastTry));
|
||||||
|
obj->Set(NanNew<String>("ip"), NanNew<String>((std::string)addr.ToStringIP()));
|
||||||
|
obj->Set(NanNew<String>("port"), NanNew<Number>((unsigned short)addr.GetPort())->ToUint32());
|
||||||
|
obj->Set(NanNew<String>("address"), NanNew<String>((std::string)addr.ToStringIPPort()));
|
||||||
|
obj->Set(NanNew<String>("reachable"), NanNew<Boolean>((bool)fReachable));
|
||||||
|
|
||||||
|
array->Set(i, obj);
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
o->Set(NanNew<String>("addresses"), array);
|
||||||
} else if (strCommand == "inv") {
|
} else if (strCommand == "inv") {
|
||||||
;
|
;
|
||||||
} else if (strCommand == "getdata") {
|
} else if (strCommand == "getdata") {
|
||||||
|
|
Loading…
Reference in New Issue