X-Git-Url: https://git.novaco.in/?p=novacoin.git;a=blobdiff_plain;f=src%2Fnet.cpp;h=af5e01a201f19d6332df94f7e34f6104369ff54a;hp=22a74a71a00795f3187c62108f5adca50803fa4a;hb=27ce22da0815f4c1fa0e949cc4740e3f4dd1ea9c;hpb=40a76f11c7056c53f71bfc60419ba7354016f55f diff --git a/src/net.cpp b/src/net.cpp index 22a74a7..af5e01a 100644 --- a/src/net.cpp +++ b/src/net.cpp @@ -142,8 +142,8 @@ CAddress GetLocalAddress(const CNetAddr *paddrPeer) bool RecvLine(SOCKET hSocket, string& strLine) { - strLine = ""; - while (true) + strLine.clear(); + for ( ; ; ) { char c; int nBytes = recv(hSocket, &c, 1, 0); @@ -218,6 +218,44 @@ void SetReachable(enum Network net, bool fFlag) vfReachable[NET_IPV4] = true; } +int GetnScore(const CService& addr) +{ + LOCK(cs_mapLocalHost); + if (mapLocalHost.count(addr) == LOCAL_NONE) + return 0; + return mapLocalHost[addr].nScore; +} + + +// Is our peer's addrLocal potentially useful as an external IP source? +bool IsPeerAddrLocalGood(CNode *pnode) +{ + return fDiscover && pnode->addr.IsRoutable() && pnode->addrLocal.IsRoutable() && + !IsLimited(pnode->addrLocal.GetNetwork()); +} + +// pushes our own address to a peer +void AdvertiseLocal(CNode *pnode) +{ + if (!fNoListen && pnode->fSuccessfullyConnected) + { + CAddress addrLocal = GetLocalAddress(&pnode->addr); + // If discovery is enabled, sometimes give our peer the address it + // tells us that it sees us as in case it has a better idea of our + // address than we do. + if (IsPeerAddrLocalGood(pnode) && (!addrLocal.IsRoutable() || + GetRand((GetnScore(addrLocal) > LOCAL_MANUAL) ? 8:2) == 0)) + { + addrLocal.SetIP(pnode->addrLocal); + } + if (addrLocal.IsRoutable()) + { + printf("AdvertiseLocal: advertising address %s\n", addrLocal.ToString().c_str()); + pnode->PushAddress(addrLocal); + } + } +} + // learn a new local address bool AddLocal(const CService& addr, int nScore) { @@ -447,8 +485,7 @@ void CNode::CloseSocketDisconnect() if (hSocket != INVALID_SOCKET) { printf("disconnecting node %s\n", addrName.c_str()); - closesocket(hSocket); - hSocket = INVALID_SOCKET; + CloseSocket(hSocket); vRecv.clear(); } @@ -571,10 +608,9 @@ void CNode::copyStats(CNodeStats &stats) } #undef X - - - - +void Release(CNode* node) { + node->Release(); +} @@ -607,7 +643,7 @@ void ThreadSocketHandler2(void* parg) { printf("ThreadSocketHandler started\n"); size_t nPrevNodeCount = 0; - while (true) + for ( ; ; ) { // // Disconnect nodes @@ -777,13 +813,13 @@ void ThreadSocketHandler2(void* parg) { LOCK(cs_setservAddNodeAddresses); if (!setservAddNodeAddresses.count(addr)) - closesocket(hSocket); + CloseSocket(hSocket); } } else if (CNode::IsBanned(addr)) { printf("connection from %s dropped (banned)\n", addr.ToString().c_str()); - closesocket(hSocket); + CloseSocket(hSocket); } else { @@ -926,8 +962,7 @@ void ThreadSocketHandler2(void* parg) } { LOCK(cs_vNodes); - BOOST_FOREACH(CNode* pnode, vNodesCopy) - pnode->Release(); + for_each(vNodesCopy.begin(), vNodesCopy.end(), Release); } Sleep(10); @@ -1155,7 +1190,7 @@ void ThreadOpenConnections2(void* parg) // Initiate network connections int64_t nStart = GetTime(); - while (true) + for ( ; ; ) { ProcessOneShot(); @@ -1182,7 +1217,6 @@ void ThreadOpenConnections2(void* parg) // it'll get a pile of addresses with newer timestamps. // Seed nodes are given a random 'last seen time' of between one and two // weeks ago. - const int64_t nOneWeek = 7*24*60*60; struct in_addr ip; memcpy(&ip, &pnSeed[i], sizeof(ip)); CAddress addr(CService(ip, GetDefaultPort())); @@ -1198,7 +1232,6 @@ void ThreadOpenConnections2(void* parg) std::vector vAdd; for (unsigned int i = 0; i < ARRAYLEN(pchTorSeed); i++) { - const int64_t nOneWeek = 7*24*60*60; CAddress addr(CService(pchTorSeed[i], GetDefaultPort())); addr.nTime = GetTime()-GetRand(nOneWeek)-nOneWeek; vAdd.push_back(addr); @@ -1228,7 +1261,7 @@ void ThreadOpenConnections2(void* parg) int64_t nANow = GetAdjustedTime(); int nTries = 0; - while (true) + for ( ; ; ) { // use an nUnkBias between 10 (no outgoing connections) and 90 (8 outgoing connections) CAddress addr = addrman.Select(10 + min(nOutbound,8)*10); @@ -1484,9 +1517,6 @@ void ThreadMessageHandler2(void* parg) StartSync(vNodesCopy); // Poll the connected nodes for messages - CNode* pnodeTrickle = NULL; - if (!vNodesCopy.empty()) - pnodeTrickle = vNodesCopy[GetRand(vNodesCopy.size())]; BOOST_FOREACH(CNode* pnode, vNodesCopy) { // Receive messages @@ -1502,7 +1532,7 @@ void ThreadMessageHandler2(void* parg) { TRY_LOCK(pnode->cs_vSend, lockSend); if (lockSend) - SendMessages(pnode, pnode == pnodeTrickle); + SendMessages(pnode); } if (fShutdown) return; @@ -1510,8 +1540,7 @@ void ThreadMessageHandler2(void* parg) { LOCK(cs_vNodes); - BOOST_FOREACH(CNode* pnode, vNodesCopy) - pnode->Release(); + for_each(vNodesCopy.begin(), vNodesCopy.end(), Release); } // Wait and allow messages to bunch up. @@ -1534,7 +1563,7 @@ void ThreadMessageHandler2(void* parg) bool BindListenPort(const CService &addrBind, string& strError) { - strError = ""; + strError.clear(); int nOne = 1; // Create socket for listening for incoming connections @@ -1607,7 +1636,7 @@ bool BindListenPort(const CService &addrBind, string& strError) else strError = strprintf(_("Unable to bind to %s on this computer (bind returned error %d, %s)"), addrBind.ToString().c_str(), nErr, strerror(nErr)); printf("%s\n", strError.c_str()); - closesocket(hListenSocket); + CloseSocket(hListenSocket); return false; } printf("Bound to %s\n", addrBind.ToString().c_str()); @@ -1617,7 +1646,7 @@ bool BindListenPort(const CService &addrBind, string& strError) { strError = strprintf("Error: Listening for incoming connections failed (listen returned error %d)", WSAGetLastError()); printf("%s\n", strError.c_str()); - closesocket(hListenSocket); + CloseSocket(hListenSocket); return false; } @@ -1763,7 +1792,7 @@ bool StopNode() if (semOutbound) for (int i=0; ipost(); - do + for ( ; ; ) { int nThreadsRunning = 0; for (int n = 0; n < THREAD_MAX; n++) @@ -1773,7 +1802,7 @@ bool StopNode() if (GetTime() - nStart > 20) break; Sleep(20); - } while(true); + }; if (vnThreadsRunning[THREAD_SOCKETHANDLER] > 0) printf("ThreadSocketHandler still running\n"); if (vnThreadsRunning[THREAD_OPENCONNECTIONS] > 0) printf("ThreadOpenConnections still running\n"); if (vnThreadsRunning[THREAD_MESSAGEHANDLER] > 0) printf("ThreadMessageHandler still running\n"); @@ -1803,11 +1832,11 @@ public: // Close sockets BOOST_FOREACH(CNode* pnode, vNodes) if (pnode->hSocket != INVALID_SOCKET) - closesocket(pnode->hSocket); + CloseSocket(pnode->hSocket); BOOST_FOREACH(SOCKET hListenSocket, vhListenSocket) if (hListenSocket != INVALID_SOCKET) - if (closesocket(hListenSocket) == SOCKET_ERROR) - printf("closesocket(hListenSocket) failed with error %d\n", WSAGetLastError()); + if (!CloseSocket(hListenSocket)) + printf("CloseSocket(hListenSocket) failed with error %d\n", WSAGetLastError()); // clean up some globals (to help leak detection) BOOST_FOREACH(CNode *pnode, vNodes) @@ -1880,3 +1909,6 @@ uint64_t CNode::GetTotalBytesSent() LOCK(cs_totalBytesSent); return nTotalBytesSent; } +int64_t PoissonNextSend(int64_t nNow, int average_interval_seconds) { + return nNow + (int64_t)(log1p(GetRand(1ULL << 48) * -0.0000000000000035527136788 /* -1/2^48 */) * average_interval_seconds * -1000000.0 + 0.5); +}