"pong" handler.
This commit is contained in:
parent
ddaa6b2698
commit
94ef4f3948
|
@ -3399,6 +3399,7 @@ NAN_METHOD(HookPackets) {
|
||||||
o->Set(NanNew<String>("received"), NanNew<Number>((int64_t)cur->nTimeReceived));
|
o->Set(NanNew<String>("received"), NanNew<Number>((int64_t)cur->nTimeReceived));
|
||||||
o->Set(NanNew<String>("peerId"), NanNew<Number>(pfrom->id));
|
o->Set(NanNew<String>("peerId"), NanNew<Number>(pfrom->id));
|
||||||
//o->Set(NanNew<String>("peerId"), NanNew<Number>(pfrom->GetId()));
|
//o->Set(NanNew<String>("peerId"), NanNew<Number>(pfrom->GetId()));
|
||||||
|
// pfrom->cleanSubVer, // string
|
||||||
|
|
||||||
if (strCommand == "version") {
|
if (strCommand == "version") {
|
||||||
#if 0
|
#if 0
|
||||||
|
@ -3641,7 +3642,67 @@ NAN_METHOD(HookPackets) {
|
||||||
o->Set(NanNew<String>("nonce"), NanNew<String>("0"));
|
o->Set(NanNew<String>("nonce"), NanNew<String>("0"));
|
||||||
}
|
}
|
||||||
} else if (strCommand == "pong") {
|
} else if (strCommand == "pong") {
|
||||||
;
|
int64_t pingUsecEnd = nTimeReceived;
|
||||||
|
uint64_t nonce = 0;
|
||||||
|
size_t nAvail = vRecv.in_avail();
|
||||||
|
bool bPingFinished = false;
|
||||||
|
std::string sProblem;
|
||||||
|
|
||||||
|
if (nAvail >= sizeof(nonce)) {
|
||||||
|
cur->vRecv >> nonce;
|
||||||
|
|
||||||
|
// Only process pong message if there is an outstanding ping (old ping without nonce should never pong)
|
||||||
|
if (pfrom->nPingNonceSent != 0) {
|
||||||
|
if (nonce == pfrom->nPingNonceSent) {
|
||||||
|
// Matching pong received, this ping is no longer outstanding
|
||||||
|
bPingFinished = true;
|
||||||
|
int64_t pingUsecTime = pingUsecEnd - pfrom->nPingUsecStart;
|
||||||
|
if (pingUsecTime > 0) {
|
||||||
|
// Successful ping time measurement, replace previous
|
||||||
|
;
|
||||||
|
} else {
|
||||||
|
// This should never happen
|
||||||
|
sProblem = "Timing mishap";
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Nonce mismatches are normal when pings are overlapping
|
||||||
|
sProblem = "Nonce mismatch";
|
||||||
|
if (nonce == 0) {
|
||||||
|
// This is most likely a bug in another implementation somewhere, cancel this ping
|
||||||
|
bPingFinished = true;
|
||||||
|
sProblem = "Nonce zero";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
sProblem = "Unsolicited pong without ping";
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// This is most likely a bug in another implementation somewhere, cancel this ping
|
||||||
|
bPingFinished = true;
|
||||||
|
sProblem = "Short payload";
|
||||||
|
}
|
||||||
|
|
||||||
|
char sNonce[21] = {0};
|
||||||
|
int written = snprintf(sNonce, sizeof(sNonce), "%020lu", (uint64_t)nonce);
|
||||||
|
assert(written == 20);
|
||||||
|
|
||||||
|
char sPingNonceSent[21] = {0};
|
||||||
|
written = snprintf(sPingNonceSent, sizeof(sPingNonceSent), "%020lu", (uint64_t)pfrom->nPingNonceSent);
|
||||||
|
assert(written == 20);
|
||||||
|
|
||||||
|
o->Set(NanNew<String>("expected"), NanNew<String>(sPingNonceSent));
|
||||||
|
o->Set(NanNew<String>("received"), NanNew<String>(sNonce));
|
||||||
|
o->Set(NanNew<String>("bytes"), NanNew<Number>((unsigned int)nAvail));
|
||||||
|
|
||||||
|
if (!(sProblem.empty())) {
|
||||||
|
o->Set(NanNew<String>("problem"), NanNew<String>(sProblem));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (bPingFinished) {
|
||||||
|
o->Set(NanNew<String>("finished"), NanNew<Boolean>(true));
|
||||||
|
} else {
|
||||||
|
o->Set(NanNew<String>("finished"), NanNew<Boolean>(false));
|
||||||
|
}
|
||||||
} else if (strCommand == "alert") {
|
} else if (strCommand == "alert") {
|
||||||
;
|
;
|
||||||
} else if (strCommand == "filterload") {
|
} else if (strCommand == "filterload") {
|
||||||
|
|
Loading…
Reference in New Issue