diff -uNr a/bitcoin/src/bitcoinrpc.cpp b/bitcoin/src/bitcoinrpc.cpp --- a/bitcoin/src/bitcoinrpc.cpp 84193f267fe20cdd9bc3a525ca206d4c00ab8b732ab386e4582e77e96e2574b08da2916e927839c8c1247867e42c9b9124f48546626f675f1d8cea705ac87b3a +++ b/bitcoin/src/bitcoinrpc.cpp 9855e2a61664f762ba151c9197678f136ef38e199ed71665315b3706dc734d72e2c010fe07efe7bb5d33a8cfe50fa380d5cc31b86fcd1ec7b559d3f83a21aa8b @@ -196,6 +196,42 @@ 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() { @@ -1850,6 +1886,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), @@ -1897,6 +1934,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 f2413ebc07b49f7a4cb96e4ae82bca531b78e4afe6b2c93be4e00a9c89813cfbb62b0f255dde13ee6e59f883936afc2640b139e49ea7a766868cdb9edc2cd3db +++ b/bitcoin/src/net.cpp 0f41846e6a31c2636e9836bdd08321c25551ed38e711a667a747d967332cb40c32a757a47599f03ed5ad111405941ac898c3fd6c6a0334fe77808dfe0cc1b443 @@ -577,16 +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; +} void ThreadSocketHandler(void* parg) { diff -uNr a/bitcoin/src/net.h b/bitcoin/src/net.h --- a/bitcoin/src/net.h f72c255497921a2dbc173565ec31179d1e5959fa3d0bc61313f6d0ac168f471ee79dce5ee92f51ee923daf2e8b1959b8368e066fd177ffcb5c57136a211bc2f0 +++ b/bitcoin/src/net.h 38be381db84ab1b427105f665e9d0b98c8ac9841bb3847216896e007198371ed69930082466d80675ca1b80928395e3887ea48866f86bcb0d7f119b429599f75 @@ -87,10 +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; +}; class CNode { @@ -585,6 +596,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); };