diff -uNr a/bitcoin/src/bitcoinrpc.cpp b/bitcoin/src/bitcoinrpc.cpp --- a/bitcoin/src/bitcoinrpc.cpp 7a2e0923be3e44c746a463b71649fb4ca12729a3aa0dd9e0e8ac83ed47dd240fa22dbb4fc0c6220e7beab25df3540220accdca04544f77992212c178f31f2131 +++ b/bitcoin/src/bitcoinrpc.cpp d76fb13f55293737606ed4b403fe50198dc03305676edbd3b7fbab42aaa9ed883d1123ad568f0227ecd3c0bf76c9b2cf0690c0a7db1781dbdbc71ecc3dd9ec33 @@ -197,6 +197,41 @@ return (int)vNodes.size(); } +Value getpeerinfo(const Array& params, bool fHelp) +{ + if (fHelp || params.size() != 0) + throw runtime_error( + "getpeerinfo\n" + "Returns data about each connected network node."); + + Array ret; + + CRITICAL_BLOCK(cs_vNodes) + { + BOOST_FOREACH(CNode* pnode, vNodes) + { + CNodeStats stats; + pnode->CopyStats(stats); + + Object obj; + obj.push_back(Pair("addr", stats.addr.ToString())); + obj.push_back(Pair("services", strprintf("%08"PRI64x, stats.nServices))); + obj.push_back(Pair("lastsend", (boost::int64_t)stats.nLastSend)); + obj.push_back(Pair("lastrecv", (boost::int64_t)stats.nLastRecv)); + obj.push_back(Pair("conntime", (boost::int64_t)stats.nTimeConnected)); + obj.push_back(Pair("version", stats.nVersion)); + obj.push_back(Pair("subver", stats.strSubVer)); + obj.push_back(Pair("inbound", stats.fInbound)); + obj.push_back(Pair("releasetime", (boost::int64_t)stats.nReleaseTime)); + obj.push_back(Pair("height", stats.nStartingHeight)); + obj.push_back(Pair("banscore", stats.nMisbehavior)); + + ret.push_back(obj); + } + } + + return ret; +} double GetDifficulty() { @@ -1905,6 +1940,7 @@ make_pair("getblockcount", &getblockcount), make_pair("getblocknumber", &getblocknumber), make_pair("getconnectioncount", &getconnectioncount), + make_pair("getpeerinfo", &getpeerinfo), make_pair("getdifficulty", &getdifficulty), make_pair("getgenerate", &getgenerate), make_pair("setgenerate", &setgenerate), @@ -1954,6 +1990,7 @@ "getblockcount", "getblocknumber", // deprecated "getconnectioncount", + "getpeerinfo", "getdifficulty", "getgenerate", "setgenerate", diff -uNr a/bitcoin/src/net.cpp b/bitcoin/src/net.cpp --- a/bitcoin/src/net.cpp 31eb2cbdf4f83f10ae8a7cdd3a69312ba6eafbecfafbeddf7546ce99847bd4f2a674037e2b89a0a7b91c37127d9770501c265a7977edb0ae0b3a5964272692f9 +++ b/bitcoin/src/net.cpp fa98850d5c82d0f70ad9e52e83f01d21269e20da11105cd696fa04c72667178717197eccf793bf23c327c7786057cb4416c338ba6e68e39d31ca943466f162dd @@ -577,7 +577,20 @@ return false; } - +void CNode::CopyStats(CNodeStats &stats) +{ + stats.nServices = nServices; + stats.nLastSend = nLastSend; + stats.nLastRecv = nLastRecv; + stats.nTimeConnected = nTimeConnected; + stats.addr = addr; + stats.nVersion = nVersion; + stats.strSubVer = strSubVer; + stats.fInbound = fInbound; + stats.nReleaseTime = nReleaseTime; + stats.nStartingHeight = nStartingHeight; + stats.nMisbehavior = nMisbehavior; +} diff -uNr a/bitcoin/src/net.h b/bitcoin/src/net.h --- a/bitcoin/src/net.h bb842420bcc67752edf8e658524b135f499c5f8676557a6c12f47f204303e34bd73beabdf6e9146ba452947c4e5cd298529969fab90f16942f6bf0c1229f7043 +++ b/bitcoin/src/net.h 3c02b2d36014eb8e55241915415a32ef39bea79604cf5ae51c4a11f5d73ee4c3930960f169b3acaf6ecfb60a07aca7472edd8a72190d240224b0bb64e6c288f6 @@ -87,7 +87,21 @@ extern int fUseProxy; extern CAddress addrProxy; - +class CNodeStats +{ +public: + uint64 nServices; + int64 nLastSend; + int64 nLastRecv; + int64 nTimeConnected; + CAddress addr; + int nVersion; + std::string strSubVer; + bool fInbound; + int64 nReleaseTime; + int nStartingHeight; + int nMisbehavior; +}; @@ -590,6 +604,7 @@ static void ClearBanned(); // needed for unit testing static bool IsBanned(unsigned int ip); bool Misbehaving(int howmuch); // 1 == a little, 100 == a lot + void CopyStats(CNodeStats &stats); };