X-Git-Url: https://git.novaco.in/?a=blobdiff_plain;f=src%2Fnet.h;h=0d941169331e867bf52bbe79f928f0a02a091d4c;hb=a22b7bac99e2948a5ce21561d86b25d0400576de;hp=be71da9c87c36485aca19ed0cd328c63f548cb09;hpb=96929d246839efe5608aaa37d4bf9b7af25fa28d;p=novacoin.git diff --git a/src/net.h b/src/net.h index be71da9..0d94116 100644 --- a/src/net.h +++ b/src/net.h @@ -5,30 +5,29 @@ #ifndef BITCOIN_NET_H #define BITCOIN_NET_H +#include #include -#include -#include -#include - -#ifndef WIN32 -#include +#ifndef Q_MOC_RUN #endif +#include #include "mruset.h" #include "netbase.h" -#include "protocol.h" #include "addrman.h" #include "hash.h" + class CRequestTracker; class CNode; class CBlockIndex; extern int nBestHeight; +const uint16_t nSocksDefault = 9050; +const uint16_t nPortZero = 0; -inline unsigned int ReceiveBufferSize() { return 1000*GetArg("-maxreceivebuffer", 5*1000); } -inline unsigned int SendBufferSize() { return 1000*GetArg("-maxsendbuffer", 1*1000); } +inline uint64_t ReceiveBufferSize() { return 1000*GetArg("-maxreceivebuffer", 5*1000); } +inline uint64_t SendBufferSize() { return 1000*GetArg("-maxsendbuffer", 1*1000); } void AddOneShot(std::string strDest); bool RecvLine(SOCKET hSocket, std::string& strLine); @@ -36,9 +35,9 @@ bool GetMyExternalIP(CNetAddr& ipRet); void AddressCurrentlyConnected(const CService& addr); CNode* FindNode(const CNetAddr& ip); CNode* FindNode(const CService& ip); -CNode* ConnectNode(CAddress addrConnect, const char *strDest = NULL, int64 nTimeout=0); -void MapPort(); -unsigned short GetListenPort(); +CNode* ConnectNode(CAddress addrConnect, const char *strDest = NULL, int64_t nTimeout=0); +bool OpenNetworkConnection(const CAddress& addrConnect, CSemaphoreGrant *grantOutbound = NULL, const char *strDest = NULL, bool fOneShot = false); +uint16_t GetListenPort(); bool BindListenPort(const CService &bindAddr, std::string& strError=REF(std::string())); void StartNode(void* parg); bool StopNode(); @@ -48,7 +47,6 @@ enum LOCAL_NONE, // unknown LOCAL_IF, // address a local interface listens on LOCAL_BIND, // address explicit bound to - LOCAL_UPNP, // address reported by UPnP LOCAL_IRC, // address reported by IRC (deprecated) LOCAL_HTTP, // address reported by whatismyip.com and similar LOCAL_MANUAL, // address explicitly specified (-externalip=) @@ -56,6 +54,9 @@ enum LOCAL_MAX }; + +bool IsPeerAddrLocalGood(CNode *pnode); +void AdvertiseLocal(CNode *pnode); void SetLimited(enum Network net, bool fLimited = true); bool IsLimited(enum Network net); bool IsLimited(const CNetAddr& addr); @@ -72,7 +73,7 @@ CAddress GetLocalAddress(const CNetAddr *paddrPeer = NULL); enum { MSG_TX = 1, - MSG_BLOCK, + MSG_BLOCK }; class CRequestTracker @@ -101,76 +102,82 @@ enum threadId THREAD_OPENCONNECTIONS, THREAD_MESSAGEHANDLER, THREAD_RPCLISTENER, - THREAD_UPNP, THREAD_DNSSEED, THREAD_ADDEDCONNECTIONS, THREAD_DUMPADDRESS, THREAD_RPCHANDLER, THREAD_MINTER, + THREAD_SCRIPTCHECK, + THREAD_NTP, + THREAD_IPCOLLECTOR, THREAD_MAX }; extern bool fClient; extern bool fDiscover; -extern bool fUseUPnP; -extern uint64 nLocalServices; -extern uint64 nLocalHostNonce; +extern bool fNoListen; + +extern bool fDiscover; +extern uint64_t nLocalServices; +extern uint64_t nLocalHostNonce; extern CAddress addrSeenByPeer; -extern boost::array vnThreadsRunning; +extern std::array vnThreadsRunning; extern CAddrMan addrman; extern std::vector vNodes; extern CCriticalSection cs_vNodes; +extern std::vector vAddedNodes; +extern CCriticalSection cs_vAddedNodes; extern std::map mapRelay; -extern std::deque > vRelayExpiration; +extern std::deque > vRelayExpiration; extern CCriticalSection cs_mapRelay; -extern std::map mapAlreadyAskedFor; - - +extern std::map mapAlreadyAskedFor; class CNodeStats { public: - uint64 nServices; - int64 nLastSend; - int64 nLastRecv; - int64 nTimeConnected; + uint64_t nServices; + int64_t nLastSend; + int64_t nLastRecv; + int64_t nTimeConnected; std::string addrName; - int nVersion; + int32_t nVersion; std::string strSubVer; bool fInbound; - int64 nReleaseTime; - int nStartingHeight; - int nMisbehavior; + int64_t nReleaseTime; + int32_t nStartingHeight; + int32_t nMisbehavior; + uint64_t nSendBytes; + uint64_t nRecvBytes; + bool fSyncNode; }; - - - -/** Information about a peer */ +// Information about a peer class CNode { public: // socket - uint64 nServices; + uint64_t nServices; SOCKET hSocket; CDataStream vSend; CDataStream vRecv; + uint64_t nSendBytes; + uint64_t nRecvBytes; CCriticalSection cs_vSend; CCriticalSection cs_vRecv; - int64 nLastSend; - int64 nLastRecv; - int64 nLastSendEmpty; - int64 nTimeConnected; - int nHeaderStart; - unsigned int nMessageStart; + int64_t nLastSend; + int64_t nLastRecv; + int64_t nLastSendEmpty; + int64_t nTimeConnected; + int32_t nHeaderStart; + uint32_t nMessageStart; CAddress addr; std::string addrName; CService addrLocal; - int nVersion; + int32_t nVersion; std::string strSubVer; bool fOneShot; bool fClient; @@ -184,18 +191,19 @@ protected: // Denial-of-service detection/prevention // Key is IP address, value is banned-until-time - static std::map setBanned; + static std::map setBanned; static CCriticalSection cs_setBanned; int nMisbehavior; public: - int64 nReleaseTime; + int64_t nReleaseTime; std::map mapRequests; CCriticalSection cs_mapRequests; uint256 hashContinue; CBlockIndex* pindexLastGetBlocksBegin; uint256 hashLastGetBlocksEnd; - int nStartingHeight; + int32_t nStartingHeight; + bool fStartSync; // flood relay std::vector vAddrToSend; @@ -203,212 +211,44 @@ public: bool fGetAddr; std::set setKnown; uint256 hashCheckpointKnown; // ppcoin: known sent sync-checkpoint + int64_t nNextAddrSend; + int64_t nNextLocalAddrSend; + int64_t nNextInvSend; // inventory based relay mruset setInventoryKnown; std::vector vInventoryToSend; CCriticalSection cs_inventory; - std::multimap mapAskFor; + std::multimap mapAskFor; - CNode(SOCKET hSocketIn, CAddress addrIn, std::string addrNameIn = "", bool fInboundIn=false) : vSend(SER_NETWORK, MIN_PROTO_VERSION), vRecv(SER_NETWORK, MIN_PROTO_VERSION) - { - nServices = 0; - hSocket = hSocketIn; - nLastSend = 0; - nLastRecv = 0; - nLastSendEmpty = GetTime(); - nTimeConnected = GetTime(); - nHeaderStart = -1; - nMessageStart = -1; - addr = addrIn; - addrName = addrNameIn == "" ? addr.ToStringIPPort() : addrNameIn; - nVersion = 0; - strSubVer = ""; - fOneShot = false; - fClient = false; // set by version message - fInbound = fInboundIn; - fNetworkNode = false; - fSuccessfullyConnected = false; - fDisconnect = false; - nRefCount = 0; - nReleaseTime = 0; - hashContinue = 0; - pindexLastGetBlocksBegin = 0; - hashLastGetBlocksEnd = 0; - nStartingHeight = -1; - fGetAddr = false; - nMisbehavior = 0; - hashCheckpointKnown = 0; - setInventoryKnown.max_size(SendBufferSize() / 1000); - - // Be shy and don't send version until we hear - if (hSocket != INVALID_SOCKET && !fInbound) - PushVersion(); - } - - ~CNode() - { - if (hSocket != INVALID_SOCKET) - { - closesocket(hSocket); - hSocket = INVALID_SOCKET; - } - } + CNode(SOCKET hSocketIn, CAddress addrIn, std::string addrNameIn = "", bool fInboundIn=false); + ~CNode(); private: + // Network usage totals + static CCriticalSection cs_totalBytesRecv; + static CCriticalSection cs_totalBytesSent; + static uint64_t nTotalBytesRecv; + static uint64_t nTotalBytesSent; CNode(const CNode&); void operator=(const CNode&); -public: - - - int GetRefCount() - { - return std::max(nRefCount, 0) + (GetTime() < nReleaseTime ? 1 : 0); - } - - CNode* AddRef(int64 nTimeout=0) - { - if (nTimeout != 0) - nReleaseTime = std::max(nReleaseTime, GetTime() + nTimeout); - else - nRefCount++; - return this; - } - - void Release() - { - nRefCount--; - } - - - - void AddAddressKnown(const CAddress& addr) - { - setAddrKnown.insert(addr); - } - - void PushAddress(const CAddress& addr) - { - // Known checking here is only to save space from duplicates. - // SendMessages will filter it again for knowns that were added - // after addresses were pushed. - if (addr.IsValid() && !setAddrKnown.count(addr)) - vAddrToSend.push_back(addr); - } - - - void AddInventoryKnown(const CInv& inv) - { - { - LOCK(cs_inventory); - setInventoryKnown.insert(inv); - } - } - - void PushInventory(const CInv& inv) - { - { - LOCK(cs_inventory); - if (!setInventoryKnown.count(inv)) - vInventoryToSend.push_back(inv); - } - } - - void AskFor(const CInv& inv) - { - // We're using mapAskFor as a priority queue, - // the key is the earliest time the request can be sent - int64& nRequestTime = mapAlreadyAskedFor[inv]; - if (fDebugNet) - printf("askfor %s %"PRI64d" (%s)\n", inv.ToString().c_str(), nRequestTime, DateTimeStrFormat("%H:%M:%S", nRequestTime/1000000).c_str()); - - // Make sure not to reuse time indexes to keep things in the same order - int64 nNow = (GetTime() - 1) * 1000000; - static int64 nLastTime; - ++nLastTime; - nNow = std::max(nNow, nLastTime); - nLastTime = nNow; - - // Each retry is 2 minutes after the last - nRequestTime = std::max(nRequestTime + 2 * 60 * 1000000, nNow); - mapAskFor.insert(std::make_pair(nRequestTime, inv)); - } - - - - void BeginMessage(const char* pszCommand) - { - ENTER_CRITICAL_SECTION(cs_vSend); - if (nHeaderStart != -1) - AbortMessage(); - nHeaderStart = vSend.size(); - vSend << CMessageHeader(pszCommand, 0); - nMessageStart = vSend.size(); - if (fDebug) - printf("sending: %s ", pszCommand); - } - - void AbortMessage() - { - if (nHeaderStart < 0) - return; - vSend.resize(nHeaderStart); - nHeaderStart = -1; - nMessageStart = -1; - LEAVE_CRITICAL_SECTION(cs_vSend); - - if (fDebug) - printf("(aborted)\n"); - } - - void EndMessage() - { - if (mapArgs.count("-dropmessagestest") && GetRand(atoi(mapArgs["-dropmessagestest"])) == 0) - { - printf("dropmessages DROPPING SEND MESSAGE\n"); - AbortMessage(); - return; - } - - if (nHeaderStart < 0) - return; - - // Set the size - unsigned int nSize = vSend.size() - nMessageStart; - memcpy((char*)&vSend[nHeaderStart] + CMessageHeader::MESSAGE_SIZE_OFFSET, &nSize, sizeof(nSize)); - - // Set the checksum - uint256 hash = Hash(vSend.begin() + nMessageStart, vSend.end()); - unsigned int nChecksum = 0; - memcpy(&nChecksum, &hash, sizeof(nChecksum)); - assert(nMessageStart - nHeaderStart >= CMessageHeader::CHECKSUM_OFFSET + sizeof(nChecksum)); - memcpy((char*)&vSend[nHeaderStart] + CMessageHeader::CHECKSUM_OFFSET, &nChecksum, sizeof(nChecksum)); - - if (fDebug) { - printf("(%d bytes)\n", nSize); - } - - nHeaderStart = -1; - nMessageStart = -1; - LEAVE_CRITICAL_SECTION(cs_vSend); - } - - void EndMessageAbortIfEmpty() - { - if (nHeaderStart < 0) - return; - int nSize = vSend.size() - nMessageStart; - if (nSize > 0) - EndMessage(); - else - AbortMessage(); - } - +public: + int GetRefCount(); + CNode* AddRef(int64_t nTimeout=0); + void Release(); + void AddAddressKnown(const CAddress& addr); + void PushAddress(const CAddress& addr); + void AddInventoryKnown(const CInv& inv); + void PushInventory(const CInv& inv); + void AskFor(const CInv& inv); + void BeginMessage(const char* pszCommand); + void AbortMessage(); + void EndMessage(); + void EndMessageAbortIfEmpty(); void PushVersion(); - void PushMessage(const char* pszCommand) { try @@ -640,21 +480,20 @@ public: static bool IsBanned(CNetAddr ip); bool Misbehaving(int howmuch); // 1 == a little, 100 == a lot void copyStats(CNodeStats &stats); -}; + // Network stats + static void RecordBytesRecv(uint64_t bytes); + static void RecordBytesSent(uint64_t bytes); -inline void RelayInventory(const CInv& inv) -{ - // Put on lists to offer to the other nodes - { - LOCK(cs_vNodes); - BOOST_FOREACH(CNode* pnode, vNodes) - pnode->PushInventory(inv); - } -} + static uint64_t GetTotalBytesRecv(); + static uint64_t GetTotalBytesSent(); +}; class CTransaction; void RelayTransaction(const CTransaction& tx, const uint256& hash); void RelayTransaction(const CTransaction& tx, const uint256& hash, const CDataStream& ss); +/** Return a timestamp in the future (in microseconds) for exponentially distributed events. */ +int64_t PoissonNextSend(int64_t nNow, int average_interval_seconds); + #endif