1 // Copyright (c) 2009-2010 Satoshi Nakamoto
2 // Distributed under the MIT/X11 software license, see the accompanying
3 // file license.txt or http://www.opensource.org/licenses/mit-license.php.
7 static const int MAX_OUTBOUND_CONNECTIONS = 8;
9 void ThreadMessageHandler2(void* parg);
10 void ThreadSocketHandler2(void* parg);
11 void ThreadOpenConnections2(void* parg);
12 bool OpenNetworkConnection(const CAddress& addrConnect);
19 // Global state variables
22 uint64 nLocalServices = (fClient ? 0 : NODE_NETWORK);
23 CAddress addrLocalHost(0, 0, nLocalServices);
24 CNode* pnodeLocalHost = NULL;
25 uint64 nLocalHostNonce = 0;
26 array<int, 10> vnThreadsRunning;
27 SOCKET hListenSocket = INVALID_SOCKET;
29 vector<CNode*> vNodes;
30 CCriticalSection cs_vNodes;
31 map<vector<unsigned char>, CAddress> mapAddresses;
32 CCriticalSection cs_mapAddresses;
33 map<CInv, CDataStream> mapRelay;
34 deque<pair<int64, CInv> > vRelayExpiration;
35 CCriticalSection cs_mapRelay;
36 map<CInv, int64> mapAlreadyAskedFor;
39 int fUseProxy = false;
40 CAddress addrProxy("127.0.0.1:9050");
46 void CNode::PushGetBlocks(CBlockIndex* pindexBegin, uint256 hashEnd)
48 // Filter out duplicate requests
49 if (pindexBegin == pindexLastGetBlocksBegin && hashEnd == hashLastGetBlocksEnd)
51 pindexLastGetBlocksBegin = pindexBegin;
52 hashLastGetBlocksEnd = hashEnd;
54 PushMessage("getblocks", CBlockLocator(pindexBegin), hashEnd);
61 bool ConnectSocket(const CAddress& addrConnect, SOCKET& hSocketRet)
63 hSocketRet = INVALID_SOCKET;
65 SOCKET hSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
66 if (hSocket == INVALID_SOCKET)
70 setsockopt(hSocket, SOL_SOCKET, SO_NOSIGPIPE, (void*)&set, sizeof(int));
73 bool fRoutable = !(addrConnect.GetByte(3) == 10 || (addrConnect.GetByte(3) == 192 && addrConnect.GetByte(2) == 168));
74 bool fProxy = (fUseProxy && fRoutable);
75 struct sockaddr_in sockaddr = (fProxy ? addrProxy.GetSockAddr() : addrConnect.GetSockAddr());
77 if (connect(hSocket, (struct sockaddr*)&sockaddr, sizeof(sockaddr)) == SOCKET_ERROR)
85 printf("proxy connecting %s\n", addrConnect.ToStringLog().c_str());
86 char pszSocks4IP[] = "\4\1\0\0\0\0\0\0user";
87 memcpy(pszSocks4IP + 2, &addrConnect.port, 2);
88 memcpy(pszSocks4IP + 4, &addrConnect.ip, 4);
89 char* pszSocks4 = pszSocks4IP;
90 int nSize = sizeof(pszSocks4IP);
92 int ret = send(hSocket, pszSocks4, nSize, MSG_NOSIGNAL);
96 return error("Error sending to proxy");
99 if (recv(hSocket, pchRet, 8, 0) != 8)
101 closesocket(hSocket);
102 return error("Error reading proxy response");
104 if (pchRet[1] != 0x5a)
106 closesocket(hSocket);
107 if (pchRet[1] != 0x5b)
108 printf("ERROR: Proxy returned error %d\n", pchRet[1]);
111 printf("proxy connected %s\n", addrConnect.ToStringLog().c_str());
114 hSocketRet = hSocket;
120 bool GetMyExternalIP2(const CAddress& addrConnect, const char* pszGet, const char* pszKeyword, unsigned int& ipRet)
123 if (!ConnectSocket(addrConnect, hSocket))
124 return error("GetMyExternalIP() : connection to %s failed", addrConnect.ToString().c_str());
126 send(hSocket, pszGet, strlen(pszGet), MSG_NOSIGNAL);
129 while (RecvLine(hSocket, strLine))
131 if (strLine.empty()) // HTTP response is separated from headers by blank line
135 if (!RecvLine(hSocket, strLine))
137 closesocket(hSocket);
140 if (pszKeyword == NULL)
142 if (strLine.find(pszKeyword) != -1)
144 strLine = strLine.substr(strLine.find(pszKeyword) + strlen(pszKeyword));
148 closesocket(hSocket);
149 if (strLine.find("<") != -1)
150 strLine = strLine.substr(0, strLine.find("<"));
151 strLine = strLine.substr(strspn(strLine.c_str(), " \t\n\r"));
152 while (strLine.size() > 0 && isspace(strLine[strLine.size()-1]))
153 strLine.resize(strLine.size()-1);
154 CAddress addr(strLine.c_str());
155 printf("GetMyExternalIP() received [%s] %s\n", strLine.c_str(), addr.ToString().c_str());
156 if (addr.ip == 0 || addr.ip == INADDR_NONE || !addr.IsRoutable())
162 closesocket(hSocket);
163 return error("GetMyExternalIP() : connection closed");
166 // We now get our external IP from the IRC server first and only use this as a backup
167 bool GetMyExternalIP(unsigned int& ipRet)
169 CAddress addrConnect;
171 const char* pszKeyword;
176 for (int nLookup = 0; nLookup <= 1; nLookup++)
177 for (int nHost = 1; nHost <= 2; nHost++)
179 // We should be phasing out our use of sites like these. If we need
180 // replacements, we should ask for volunteers to put this simple
181 // php file on their webserver that prints the client IP:
182 // <?php echo $_SERVER["REMOTE_ADDR"]; ?>
185 addrConnect = CAddress("91.198.22.70:80"); // checkip.dyndns.org
189 struct hostent* phostent = gethostbyname("checkip.dyndns.org");
190 if (phostent && phostent->h_addr_list && phostent->h_addr_list[0])
191 addrConnect = CAddress(*(u_long*)phostent->h_addr_list[0], htons(80));
194 pszGet = "GET / HTTP/1.1\r\n"
195 "Host: checkip.dyndns.org\r\n"
196 "User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)\r\n"
197 "Connection: close\r\n"
200 pszKeyword = "Address:";
204 addrConnect = CAddress("74.208.43.192:80"); // www.showmyip.com
208 struct hostent* phostent = gethostbyname("www.showmyip.com");
209 if (phostent && phostent->h_addr_list && phostent->h_addr_list[0])
210 addrConnect = CAddress(*(u_long*)phostent->h_addr_list[0], htons(80));
213 pszGet = "GET /simple/ HTTP/1.1\r\n"
214 "Host: www.showmyip.com\r\n"
215 "User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)\r\n"
216 "Connection: close\r\n"
219 pszKeyword = NULL; // Returns just IP address
222 if (GetMyExternalIP2(addrConnect, pszGet, pszKeyword, ipRet))
229 void ThreadGetMyExternalIP(void* parg)
231 // Wait for IRC to get it first
232 if (!GetBoolArg("-noirc"))
234 for (int i = 0; i < 2 * 60; i++)
237 if (fGotExternalIP || fShutdown)
242 // Fallback in case IRC fails to get it
243 if (GetMyExternalIP(addrLocalHost.ip))
245 printf("GetMyExternalIP() returned %s\n", addrLocalHost.ToStringIP().c_str());
246 if (addrLocalHost.IsRoutable())
248 // If we already connected to a few before we had our IP, go back and addr them.
249 // setAddrKnown automatically filters any duplicate sends.
250 CAddress addr(addrLocalHost);
251 addr.nTime = GetAdjustedTime();
252 CRITICAL_BLOCK(cs_vNodes)
253 foreach(CNode* pnode, vNodes)
254 pnode->PushAddress(addr);
263 bool AddAddress(CAddress addr, int64 nTimePenalty)
265 if (!addr.IsRoutable())
267 if (addr.ip == addrLocalHost.ip)
269 addr.nTime = max((int64)0, (int64)addr.nTime - nTimePenalty);
270 CRITICAL_BLOCK(cs_mapAddresses)
272 map<vector<unsigned char>, CAddress>::iterator it = mapAddresses.find(addr.GetKey());
273 if (it == mapAddresses.end())
276 printf("AddAddress(%s)\n", addr.ToStringLog().c_str());
277 mapAddresses.insert(make_pair(addr.GetKey(), addr));
278 CAddrDB().WriteAddress(addr);
283 bool fUpdated = false;
284 CAddress& addrFound = (*it).second;
285 if ((addrFound.nServices | addr.nServices) != addrFound.nServices)
287 // Services have been added
288 addrFound.nServices |= addr.nServices;
291 bool fCurrentlyOnline = (GetAdjustedTime() - addr.nTime < 24 * 60 * 60);
292 int64 nUpdateInterval = (fCurrentlyOnline ? 60 * 60 : 24 * 60 * 60);
293 if (addrFound.nTime < addr.nTime - nUpdateInterval)
295 // Periodically update most recently seen time
296 addrFound.nTime = addr.nTime;
300 CAddrDB().WriteAddress(addrFound);
306 void AddressCurrentlyConnected(const CAddress& addr)
308 CRITICAL_BLOCK(cs_mapAddresses)
310 // Only if it's been published already
311 map<vector<unsigned char>, CAddress>::iterator it = mapAddresses.find(addr.GetKey());
312 if (it != mapAddresses.end())
314 CAddress& addrFound = (*it).second;
315 int64 nUpdateInterval = 20 * 60;
316 if (addrFound.nTime < GetAdjustedTime() - nUpdateInterval)
318 // Periodically update most recently seen time
319 addrFound.nTime = GetAdjustedTime();
321 addrdb.WriteAddress(addrFound);
331 void AbandonRequests(void (*fn)(void*, CDataStream&), void* param1)
333 // If the dialog might get closed before the reply comes back,
334 // call this in the destructor so it doesn't get called after it's deleted.
335 CRITICAL_BLOCK(cs_vNodes)
337 foreach(CNode* pnode, vNodes)
339 CRITICAL_BLOCK(pnode->cs_mapRequests)
341 for (map<uint256, CRequestTracker>::iterator mi = pnode->mapRequests.begin(); mi != pnode->mapRequests.end();)
343 CRequestTracker& tracker = (*mi).second;
344 if (tracker.fn == fn && tracker.param1 == param1)
345 pnode->mapRequests.erase(mi++);
361 // Subscription methods for the broadcast and subscription system.
362 // Channel numbers are message numbers, i.e. MSG_TABLE and MSG_PRODUCT.
364 // The subscription system uses a meet-in-the-middle strategy.
365 // With 100,000 nodes, if senders broadcast to 1000 random nodes and receivers
366 // subscribe to 1000 random nodes, 99.995% (1 - 0.99^1000) of messages will get through.
369 bool AnySubscribed(unsigned int nChannel)
371 if (pnodeLocalHost->IsSubscribed(nChannel))
373 CRITICAL_BLOCK(cs_vNodes)
374 foreach(CNode* pnode, vNodes)
375 if (pnode->IsSubscribed(nChannel))
380 bool CNode::IsSubscribed(unsigned int nChannel)
382 if (nChannel >= vfSubscribe.size())
384 return vfSubscribe[nChannel];
387 void CNode::Subscribe(unsigned int nChannel, unsigned int nHops)
389 if (nChannel >= vfSubscribe.size())
392 if (!AnySubscribed(nChannel))
395 CRITICAL_BLOCK(cs_vNodes)
396 foreach(CNode* pnode, vNodes)
398 pnode->PushMessage("subscribe", nChannel, nHops);
401 vfSubscribe[nChannel] = true;
404 void CNode::CancelSubscribe(unsigned int nChannel)
406 if (nChannel >= vfSubscribe.size())
409 // Prevent from relaying cancel if wasn't subscribed
410 if (!vfSubscribe[nChannel])
412 vfSubscribe[nChannel] = false;
414 if (!AnySubscribed(nChannel))
416 // Relay subscription cancel
417 CRITICAL_BLOCK(cs_vNodes)
418 foreach(CNode* pnode, vNodes)
420 pnode->PushMessage("sub-cancel", nChannel);
432 CNode* FindNode(unsigned int ip)
434 CRITICAL_BLOCK(cs_vNodes)
436 foreach(CNode* pnode, vNodes)
437 if (pnode->addr.ip == ip)
443 CNode* FindNode(CAddress addr)
445 CRITICAL_BLOCK(cs_vNodes)
447 foreach(CNode* pnode, vNodes)
448 if (pnode->addr == addr)
454 CNode* ConnectNode(CAddress addrConnect, int64 nTimeout)
456 if (addrConnect.ip == addrLocalHost.ip)
459 // Look for an existing connection
460 CNode* pnode = FindNode(addrConnect.ip);
464 pnode->AddRef(nTimeout);
471 printf("trying connection %s lastseen=%.1fhrs lasttry=%.1fhrs\n",
472 addrConnect.ToStringLog().c_str(),
473 (double)(addrConnect.nTime - GetAdjustedTime())/3600.0,
474 (double)(addrConnect.nLastTry - GetAdjustedTime())/3600.0);
476 CRITICAL_BLOCK(cs_mapAddresses)
477 mapAddresses[addrConnect.GetKey()].nLastTry = GetAdjustedTime();
481 if (ConnectSocket(addrConnect, hSocket))
484 printf("connected %s\n", addrConnect.ToStringLog().c_str());
486 // Set to nonblocking
489 if (ioctlsocket(hSocket, FIONBIO, &nOne) == SOCKET_ERROR)
490 printf("ConnectSocket() : ioctlsocket nonblocking setting failed, error %d\n", WSAGetLastError());
492 if (fcntl(hSocket, F_SETFL, O_NONBLOCK) == SOCKET_ERROR)
493 printf("ConnectSocket() : fcntl nonblocking setting failed, error %d\n", errno);
497 CNode* pnode = new CNode(hSocket, addrConnect, false);
499 pnode->AddRef(nTimeout);
502 CRITICAL_BLOCK(cs_vNodes)
503 vNodes.push_back(pnode);
505 pnode->nTimeConnected = GetTime();
514 void CNode::CloseSocketDisconnect()
517 if (hSocket != INVALID_SOCKET)
520 printf("%s ", DateTimeStrFormat("%x %H:%M:%S", GetTime()).c_str());
521 printf("disconnecting node %s\n", addr.ToStringLog().c_str());
522 closesocket(hSocket);
523 hSocket = INVALID_SOCKET;
527 void CNode::Cleanup()
529 // All of a nodes broadcasts and subscriptions are automatically torn down
530 // when it goes down, so a node has to stay up to keep its broadcast going.
532 // Cancel subscriptions
533 for (unsigned int nChannel = 0; nChannel < vfSubscribe.size(); nChannel++)
534 if (vfSubscribe[nChannel])
535 CancelSubscribe(nChannel);
550 void ThreadSocketHandler(void* parg)
552 IMPLEMENT_RANDOMIZE_STACK(ThreadSocketHandler(parg));
555 vnThreadsRunning[0]++;
556 ThreadSocketHandler2(parg);
557 vnThreadsRunning[0]--;
559 catch (std::exception& e) {
560 vnThreadsRunning[0]--;
561 PrintException(&e, "ThreadSocketHandler()");
563 vnThreadsRunning[0]--;
564 throw; // support pthread_cancel()
566 printf("ThreadSocketHandler exiting\n");
569 void ThreadSocketHandler2(void* parg)
571 printf("ThreadSocketHandler started\n");
572 list<CNode*> vNodesDisconnected;
573 int nPrevNodeCount = 0;
580 CRITICAL_BLOCK(cs_vNodes)
582 // Disconnect unused nodes
583 vector<CNode*> vNodesCopy = vNodes;
584 foreach(CNode* pnode, vNodesCopy)
586 if (pnode->fDisconnect ||
587 (pnode->GetRefCount() <= 0 && pnode->vRecv.empty() && pnode->vSend.empty()))
589 // remove from vNodes
590 vNodes.erase(remove(vNodes.begin(), vNodes.end(), pnode), vNodes.end());
592 // close socket and cleanup
593 pnode->CloseSocketDisconnect();
596 // hold in disconnected pool until all refs are released
597 pnode->nReleaseTime = max(pnode->nReleaseTime, GetTime() + 15 * 60);
598 if (pnode->fNetworkNode || pnode->fInbound)
600 vNodesDisconnected.push_back(pnode);
604 // Delete disconnected nodes
605 list<CNode*> vNodesDisconnectedCopy = vNodesDisconnected;
606 foreach(CNode* pnode, vNodesDisconnectedCopy)
608 // wait until threads are done using it
609 if (pnode->GetRefCount() <= 0)
611 bool fDelete = false;
612 TRY_CRITICAL_BLOCK(pnode->cs_vSend)
613 TRY_CRITICAL_BLOCK(pnode->cs_vRecv)
614 TRY_CRITICAL_BLOCK(pnode->cs_mapRequests)
615 TRY_CRITICAL_BLOCK(pnode->cs_inventory)
619 vNodesDisconnected.remove(pnode);
625 if (vNodes.size() != nPrevNodeCount)
627 nPrevNodeCount = vNodes.size();
633 // Find which sockets have data to receive
635 struct timeval timeout;
637 timeout.tv_usec = 50000; // frequency to poll pnode->vSend
644 FD_ZERO(&fdsetError);
645 SOCKET hSocketMax = 0;
647 if(hListenSocket != INVALID_SOCKET)
648 FD_SET(hListenSocket, &fdsetRecv);
649 hSocketMax = max(hSocketMax, hListenSocket);
650 CRITICAL_BLOCK(cs_vNodes)
652 foreach(CNode* pnode, vNodes)
654 if (pnode->hSocket == INVALID_SOCKET || pnode->hSocket < 0)
656 FD_SET(pnode->hSocket, &fdsetRecv);
657 FD_SET(pnode->hSocket, &fdsetError);
658 hSocketMax = max(hSocketMax, pnode->hSocket);
659 TRY_CRITICAL_BLOCK(pnode->cs_vSend)
660 if (!pnode->vSend.empty())
661 FD_SET(pnode->hSocket, &fdsetSend);
665 vnThreadsRunning[0]--;
666 int nSelect = select(hSocketMax + 1, &fdsetRecv, &fdsetSend, &fdsetError, &timeout);
667 vnThreadsRunning[0]++;
670 if (nSelect == SOCKET_ERROR)
672 int nErr = WSAGetLastError();
673 printf("socket select error %d\n", nErr);
674 for (int i = 0; i <= hSocketMax; i++)
675 FD_SET(i, &fdsetRecv);
677 FD_ZERO(&fdsetError);
678 Sleep(timeout.tv_usec/1000);
683 // Accept new connections
685 if (hListenSocket != INVALID_SOCKET && FD_ISSET(hListenSocket, &fdsetRecv))
687 struct sockaddr_in sockaddr;
688 socklen_t len = sizeof(sockaddr);
689 SOCKET hSocket = accept(hListenSocket, (struct sockaddr*)&sockaddr, &len);
690 CAddress addr(sockaddr);
691 if (hSocket == INVALID_SOCKET)
693 if (WSAGetLastError() != WSAEWOULDBLOCK)
694 printf("socket error accept failed: %d\n", WSAGetLastError());
696 else if (mapArgs.count("-maxconnections") && (int)vNodes.size() >= atoi(mapArgs["-maxconnections"]) - MAX_OUTBOUND_CONNECTIONS)
698 closesocket(hSocket);
702 printf("accepted connection %s\n", addr.ToStringLog().c_str());
703 CNode* pnode = new CNode(hSocket, addr, true);
705 CRITICAL_BLOCK(cs_vNodes)
706 vNodes.push_back(pnode);
712 // Service each socket
714 vector<CNode*> vNodesCopy;
715 CRITICAL_BLOCK(cs_vNodes)
718 foreach(CNode* pnode, vNodesCopy)
721 foreach(CNode* pnode, vNodesCopy)
729 if (pnode->hSocket == INVALID_SOCKET)
731 if (FD_ISSET(pnode->hSocket, &fdsetRecv) || FD_ISSET(pnode->hSocket, &fdsetError))
733 TRY_CRITICAL_BLOCK(pnode->cs_vRecv)
735 CDataStream& vRecv = pnode->vRecv;
736 unsigned int nPos = vRecv.size();
738 // typical socket buffer is 8K-64K
739 char pchBuf[0x10000];
740 int nBytes = recv(pnode->hSocket, pchBuf, sizeof(pchBuf), MSG_DONTWAIT);
743 vRecv.resize(nPos + nBytes);
744 memcpy(&vRecv[nPos], pchBuf, nBytes);
745 pnode->nLastRecv = GetTime();
747 else if (nBytes == 0)
749 // socket closed gracefully
750 if (!pnode->fDisconnect)
751 printf("socket closed\n");
752 pnode->CloseSocketDisconnect();
757 int nErr = WSAGetLastError();
758 if (nErr != WSAEWOULDBLOCK && nErr != WSAEMSGSIZE && nErr != WSAEINTR && nErr != WSAEINPROGRESS)
760 if (!pnode->fDisconnect)
761 printf("socket recv error %d\n", nErr);
762 pnode->CloseSocketDisconnect();
771 if (pnode->hSocket == INVALID_SOCKET)
773 if (FD_ISSET(pnode->hSocket, &fdsetSend))
775 TRY_CRITICAL_BLOCK(pnode->cs_vSend)
777 CDataStream& vSend = pnode->vSend;
780 int nBytes = send(pnode->hSocket, &vSend[0], vSend.size(), MSG_NOSIGNAL | MSG_DONTWAIT);
783 vSend.erase(vSend.begin(), vSend.begin() + nBytes);
784 pnode->nLastSend = GetTime();
789 int nErr = WSAGetLastError();
790 if (nErr != WSAEWOULDBLOCK && nErr != WSAEMSGSIZE && nErr != WSAEINTR && nErr != WSAEINPROGRESS)
792 printf("socket send error %d\n", nErr);
793 pnode->CloseSocketDisconnect();
801 // Inactivity checking
803 if (pnode->vSend.empty())
804 pnode->nLastSendEmpty = GetTime();
805 if (GetTime() - pnode->nTimeConnected > 60)
807 if (pnode->nLastRecv == 0 || pnode->nLastSend == 0)
809 printf("socket no message in first 60 seconds, %d %d\n", pnode->nLastRecv != 0, pnode->nLastSend != 0);
810 pnode->fDisconnect = true;
812 else if (GetTime() - pnode->nLastSend > 90*60 && GetTime() - pnode->nLastSendEmpty > 90*60)
814 printf("socket not sending\n");
815 pnode->fDisconnect = true;
817 else if (GetTime() - pnode->nLastRecv > 90*60)
819 printf("socket inactivity timeout\n");
820 pnode->fDisconnect = true;
824 CRITICAL_BLOCK(cs_vNodes)
826 foreach(CNode* pnode, vNodesCopy)
846 unsigned int pnSeed[] =
849 0x35218252, 0x9c9c9618, 0xda6bacad, 0xb9aca862, 0x97c235c6,
850 0x146f9562, 0xb67b9e4b, 0x87cf4bc0, 0xb83945d0, 0x984333ad,
851 0xbbeec555, 0x6f0eb440, 0xe0005318, 0x7797e460, 0xddc60fcc,
852 0xb3bbd24a, 0x1ac85746, 0x641846a6, 0x85ee1155, 0xbb2e7a4c,
853 0x9cb8514b, 0xfc342648, 0x62958fae, 0xd0a8c87a, 0xa800795b,
854 0xda8c814e, 0x256a0c80, 0x3f23ec63, 0xd565df43, 0x997d9044,
855 0xaa121448, 0xbed8688e, 0x59d09a5e, 0xb2931243, 0x3730ba18,
856 0xdd3462d0, 0x4e4d1448, 0x171df645, 0x84ee1155,
857 0x248ac445, 0x0e634444, 0x0ded1b63, 0x30c01e60,
858 0xa2b9a094, 0x29e4fd43, 0x9ce61b4c, 0xdae09744,
861 0x5ae6bf43, 0x460be257, 0x7245c0cf, 0x4e0f028d, 0x26501760, 0x38643255, 0x67094f4f, 0x480449b8,
862 0x16545143, 0x1f082e5a, 0xaa428018, 0xe411e793, 0x14c1f862, 0x2726105b, 0x9b33ea50, 0xeeef86ca,
863 0xe3210d44, 0x0dca8b63, 0x3f9dfb18, 0x860340ad, 0xf33ba17a, 0x9018375c, 0x1de4e353, 0x0fa52dcb,
864 0x89c4555b, 0x109cf37b, 0x28c55b40, 0x04c801ae, 0x275c1e80, 0x6f7f745d, 0x7a2a5653, 0xa28e26d8,
865 0xa4e65db2, 0x99a06580, 0xf253ba44, 0x82cf6ab8, 0x859c2e8e, 0xf71a815d, 0xc18f1454, 0x71c8a943,
866 0x90d24e18, 0x311789b2, 0x74aba645, 0xde0bbfc3, 0xad724fad, 0xbf1ae15e, 0xbaa6fb54, 0x06e4d145,
867 0x51528645, 0x72120cd4, 0xd4cfd145, 0x0a7afed8, 0x9b9a5fad, 0x9e9ff45e, 0x10128355, 0xd44e8646,
868 0x04a07b47, 0x5fc9d547, 0xe0491e45, 0xbac21b41, 0x7aa31bae, 0x10483c5f, 0x94a23055, 0x73d9dc47,
869 0x1a99c247, 0x822fe847, 0x7e57ba48, 0xb19ea843, 0xa60621b2, 0x778cf163, 0x125c6556, 0xf94ba44f,
870 0xa61a0948, 0x6c839e4b, 0x29af5348, 0x68d84845, 0x752b95c3, 0xcf0d4663, 0x08e11e56, 0x75109550,
871 0x5f24b94c, 0x42426d4d, 0xfbbc0a4c, 0x70a9a246, 0xda7837cb, 0xae2a986d, 0xe283c358, 0x0c7ca954,
872 0x8e9bde59, 0x61521760, 0x6884444c, 0xa194e548, 0x9b8809cc, 0x16e96a8f, 0x956ff859, 0xfad5e555,
873 0x0ea70c80, 0x5b4ce26d, 0x7984444c, 0x1080d24a, 0x22a686cf, 0x6bf8c2ad, 0xb0f7485f, 0x06b66e56,
874 0x668373bc, 0x75506279, 0x3868694e, 0x12a5954b, 0x3a8b62d1, 0xb74fcbad, 0xa7dc3360, 0xc070b359,
875 0xa2b87242, 0xc45cab7c, 0x69882050, 0x14a5464b, 0x386acad5, 0x80b85db2, 0x1f78a062, 0xc608c55b,
876 0x4257d543, 0x7636ad80, 0x4432d655, 0xb2114d4b, 0x32639bd9, 0xadd75db2, 0x9be5a362, 0x6831bc5e,
877 0xf7f77046, 0x8f35ba81, 0x09bb4e59, 0xd0fb6b4e, 0xc5daa445, 0x9c611618, 0x355dcc62, 0xf2cf435e,
878 0x31e72c46, 0xdd8a43ad, 0x171f9c5b, 0xb4c2e355, 0xbe8af945, 0x613d3942, 0xe6f9e863, 0x7a3d855f,
879 0xa66adc47, 0x261089b2, 0x5a27105b, 0x6c28105b, 0xdd247946, 0xe6c3a445, 0x43a1ec63, 0x99b4dd5f,
880 0xb6834347, 0x5e9649bc, 0xf9dd545d, 0x6ae4c15b, 0xa5318a47, 0x7984ec47, 0x93a73b63, 0x0c60195f,
881 0xa5c85e4b, 0xa0a36dc2, 0x0739a95e, 0x3d44c15b, 0xfb940f4b, 0xd67c9148, 0x614f9876, 0x0a241c5f,
882 0xad9da74c, 0x4459abc8, 0x12e71b5f, 0x1c534a5d, 0x8ff5fc50, 0x2ca8864b, 0xd894fd80, 0x82ab3160,
883 0x390d804e, 0x2cf310cc, 0x680dad80, 0x691be15e, 0x5a8f4652, 0xaad0784d, 0x0d2431ad,
888 void ThreadOpenConnections(void* parg)
890 IMPLEMENT_RANDOMIZE_STACK(ThreadOpenConnections(parg));
893 vnThreadsRunning[1]++;
894 ThreadOpenConnections2(parg);
895 vnThreadsRunning[1]--;
897 catch (std::exception& e) {
898 vnThreadsRunning[1]--;
899 PrintException(&e, "ThreadOpenConnections()");
901 vnThreadsRunning[1]--;
902 PrintException(NULL, "ThreadOpenConnections()");
904 printf("ThreadOpenConnections exiting\n");
907 void ThreadOpenConnections2(void* parg)
909 printf("ThreadOpenConnections started\n");
911 // Connect to specific addresses
912 if (mapArgs.count("-connect"))
914 for (int64 nLoop = 0;; nLoop++)
916 foreach(string strAddr, mapMultiArgs["-connect"])
918 CAddress addr(strAddr, NODE_NETWORK);
920 OpenNetworkConnection(addr);
921 for (int i = 0; i < 10 && i < nLoop; i++)
931 // Connect to manually added nodes first
932 if (mapArgs.count("-addnode"))
934 foreach(string strAddr, mapMultiArgs["-addnode"])
936 CAddress addr(strAddr, NODE_NETWORK);
939 OpenNetworkConnection(addr);
947 // Initiate network connections
948 int64 nStart = GetTime();
951 // Limit outbound connections
952 vnThreadsRunning[1]--;
957 CRITICAL_BLOCK(cs_vNodes)
958 foreach(CNode* pnode, vNodes)
959 if (!pnode->fInbound)
961 int nMaxOutboundConnections = MAX_OUTBOUND_CONNECTIONS;
962 if (mapArgs.count("-maxconnections"))
963 nMaxOutboundConnections = min(nMaxOutboundConnections, atoi(mapArgs["-maxconnections"]));
964 if (nOutbound < nMaxOutboundConnections)
970 vnThreadsRunning[1]++;
974 CRITICAL_BLOCK(cs_mapAddresses)
976 // Add seed nodes if IRC isn't working
977 static bool fSeedUsed;
978 bool fTOR = (fUseProxy && addrProxy.port == htons(9050));
979 if (mapAddresses.empty() && (GetTime() - nStart > 60 || fTOR) && !fTestNet)
981 for (int i = 0; i < ARRAYLEN(pnSeed); i++)
983 // It'll only connect to one or two seed nodes because once it connects,
984 // it'll get a pile of addresses with newer timestamps.
993 if (fSeedUsed && mapAddresses.size() > ARRAYLEN(pnSeed) + 100)
995 // Disconnect seed nodes
996 set<unsigned int> setSeed(pnSeed, pnSeed + ARRAYLEN(pnSeed));
997 static int64 nSeedDisconnected;
998 if (nSeedDisconnected == 0)
1000 nSeedDisconnected = GetTime();
1001 CRITICAL_BLOCK(cs_vNodes)
1002 foreach(CNode* pnode, vNodes)
1003 if (setSeed.count(pnode->addr.ip))
1004 pnode->fDisconnect = true;
1007 // Keep setting timestamps to 0 so they won't reconnect
1008 if (GetTime() - nSeedDisconnected < 60 * 60)
1010 foreach(PAIRTYPE(const vector<unsigned char>, CAddress)& item, mapAddresses)
1012 if (setSeed.count(item.second.ip))
1014 item.second.nTime = 0;
1015 CAddrDB().WriteAddress(item.second);
1024 // Choose an address to connect to based on most recently seen
1026 CAddress addrConnect;
1027 int64 nBest = INT64_MIN;
1029 // Only connect to one address per a.b.?.? range.
1030 // Do this here so we don't have to critsect vNodes inside mapAddresses critsect.
1031 set<unsigned int> setConnected;
1032 CRITICAL_BLOCK(cs_vNodes)
1033 foreach(CNode* pnode, vNodes)
1034 setConnected.insert(pnode->addr.ip & 0x0000ffff);
1036 CRITICAL_BLOCK(cs_mapAddresses)
1038 foreach(const PAIRTYPE(vector<unsigned char>, CAddress)& item, mapAddresses)
1040 const CAddress& addr = item.second;
1041 if (!addr.IsIPv4() || !addr.IsValid() || setConnected.count(addr.ip & 0x0000ffff))
1043 int64 nSinceLastSeen = GetAdjustedTime() - addr.nTime;
1044 int64 nSinceLastTry = GetAdjustedTime() - addr.nLastTry;
1046 // Randomize the order in a deterministic way, putting the standard port first
1047 int64 nRandomizer = (uint64)(nStart * 4951 + addr.nLastTry * 9567851 + addr.ip * 7789) % (2 * 60 * 60);
1048 if (addr.port != GetDefaultPort())
1049 nRandomizer += 2 * 60 * 60;
1051 // Last seen Base retry frequency
1060 // 365 days 93 hours
1061 int64 nDelay = (int64)(3600.0 * sqrt(fabs((double)nSinceLastSeen) / 3600.0) + nRandomizer);
1063 // Fast reconnect for one hour after last seen
1064 if (nSinceLastSeen < 60 * 60)
1067 // Limit retry frequency
1068 if (nSinceLastTry < nDelay)
1071 // If we have IRC, we'll be notified when they first come online,
1072 // and again every 24 hours by the refresh broadcast.
1073 if (nGotIRCAddresses > 0 && vNodes.size() >= 2 && nSinceLastSeen > 24 * 60 * 60)
1076 // Only try the old stuff if we don't have enough connections
1077 if (vNodes.size() >= 8 && nSinceLastSeen > 24 * 60 * 60)
1080 // If multiple addresses are ready, prioritize by time since
1081 // last seen and time since last tried.
1082 int64 nScore = min(nSinceLastTry, (int64)24 * 60 * 60) - nSinceLastSeen - nRandomizer;
1091 if (addrConnect.IsValid())
1092 OpenNetworkConnection(addrConnect);
1096 bool OpenNetworkConnection(const CAddress& addrConnect)
1099 // Initiate outbound network connection
1103 if (addrConnect.ip == addrLocalHost.ip || !addrConnect.IsIPv4() || FindNode(addrConnect.ip))
1106 vnThreadsRunning[1]--;
1107 CNode* pnode = ConnectNode(addrConnect);
1108 vnThreadsRunning[1]++;
1113 pnode->fNetworkNode = true;
1125 void ThreadMessageHandler(void* parg)
1127 IMPLEMENT_RANDOMIZE_STACK(ThreadMessageHandler(parg));
1130 vnThreadsRunning[2]++;
1131 ThreadMessageHandler2(parg);
1132 vnThreadsRunning[2]--;
1134 catch (std::exception& e) {
1135 vnThreadsRunning[2]--;
1136 PrintException(&e, "ThreadMessageHandler()");
1138 vnThreadsRunning[2]--;
1139 PrintException(NULL, "ThreadMessageHandler()");
1141 printf("ThreadMessageHandler exiting\n");
1144 void ThreadMessageHandler2(void* parg)
1146 printf("ThreadMessageHandler started\n");
1147 SetThreadPriority(THREAD_PRIORITY_BELOW_NORMAL);
1150 vector<CNode*> vNodesCopy;
1151 CRITICAL_BLOCK(cs_vNodes)
1153 vNodesCopy = vNodes;
1154 foreach(CNode* pnode, vNodesCopy)
1158 // Poll the connected nodes for messages
1159 CNode* pnodeTrickle = NULL;
1160 if (!vNodesCopy.empty())
1161 pnodeTrickle = vNodesCopy[GetRand(vNodesCopy.size())];
1162 foreach(CNode* pnode, vNodesCopy)
1165 TRY_CRITICAL_BLOCK(pnode->cs_vRecv)
1166 ProcessMessages(pnode);
1171 TRY_CRITICAL_BLOCK(pnode->cs_vSend)
1172 SendMessages(pnode, pnode == pnodeTrickle);
1177 CRITICAL_BLOCK(cs_vNodes)
1179 foreach(CNode* pnode, vNodesCopy)
1183 // Wait and allow messages to bunch up.
1184 // Reduce vnThreadsRunning so StopNode has permission to exit while
1185 // we're sleeping, but we must always check fShutdown after doing this.
1186 vnThreadsRunning[2]--;
1188 if (fRequestShutdown)
1190 vnThreadsRunning[2]++;
1204 bool BindListenPort(string& strError)
1208 addrLocalHost.port = GetDefaultPort();
1211 // Initialize Windows Sockets
1213 int ret = WSAStartup(MAKEWORD(2,2), &wsadata);
1214 if (ret != NO_ERROR)
1216 strError = strprintf("Error: TCP/IP socket library failed to start (WSAStartup returned error %d)", ret);
1217 printf("%s\n", strError.c_str());
1222 // Create socket for listening for incoming connections
1223 hListenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
1224 if (hListenSocket == INVALID_SOCKET)
1226 strError = strprintf("Error: Couldn't open socket for incoming connections (socket returned error %d)", WSAGetLastError());
1227 printf("%s\n", strError.c_str());
1232 // Different way of disabling SIGPIPE on BSD
1233 setsockopt(hListenSocket, SOL_SOCKET, SO_NOSIGPIPE, (void*)&nOne, sizeof(int));
1237 // Allow binding if the port is still in TIME_WAIT state after
1238 // the program was closed and restarted. Not an issue on windows.
1239 setsockopt(hListenSocket, SOL_SOCKET, SO_REUSEADDR, (void*)&nOne, sizeof(int));
1243 // Set to nonblocking, incoming connections will also inherit this
1244 if (ioctlsocket(hListenSocket, FIONBIO, (u_long*)&nOne) == SOCKET_ERROR)
1246 if (fcntl(hListenSocket, F_SETFL, O_NONBLOCK) == SOCKET_ERROR)
1249 strError = strprintf("Error: Couldn't set properties on socket for incoming connections (error %d)", WSAGetLastError());
1250 printf("%s\n", strError.c_str());
1254 // The sockaddr_in structure specifies the address family,
1255 // IP address, and port for the socket that is being bound
1256 struct sockaddr_in sockaddr;
1257 memset(&sockaddr, 0, sizeof(sockaddr));
1258 sockaddr.sin_family = AF_INET;
1259 sockaddr.sin_addr.s_addr = INADDR_ANY; // bind to all IPs on this computer
1260 sockaddr.sin_port = GetDefaultPort();
1261 if (::bind(hListenSocket, (struct sockaddr*)&sockaddr, sizeof(sockaddr)) == SOCKET_ERROR)
1263 int nErr = WSAGetLastError();
1264 if (nErr == WSAEADDRINUSE)
1265 strError = strprintf(_("Unable to bind to port %d on this computer. Bitcoin is probably already running."), ntohs(sockaddr.sin_port));
1267 strError = strprintf("Error: Unable to bind to port %d on this computer (bind returned error %d)", ntohs(sockaddr.sin_port), nErr);
1268 printf("%s\n", strError.c_str());
1271 printf("Bound to port %d\n", ntohs(sockaddr.sin_port));
1273 // Listen for incoming connections
1274 if (listen(hListenSocket, SOMAXCONN) == SOCKET_ERROR)
1276 strError = strprintf("Error: Listening for incoming connections failed (listen returned error %d)", WSAGetLastError());
1277 printf("%s\n", strError.c_str());
1284 void StartNode(void* parg)
1286 if (pnodeLocalHost == NULL)
1287 pnodeLocalHost = new CNode(INVALID_SOCKET, CAddress("127.0.0.1", nLocalServices));
1290 // Get local host ip
1291 char pszHostName[1000] = "";
1292 if (gethostname(pszHostName, sizeof(pszHostName)) != SOCKET_ERROR)
1294 struct hostent* phostent = gethostbyname(pszHostName);
1297 // Take the first IP that isn't loopback 127.x.x.x
1298 for (int i = 0; phostent->h_addr_list[i] != NULL; i++)
1299 printf("host ip %d: %s\n", i, CAddress(*(unsigned int*)phostent->h_addr_list[i]).ToStringIP().c_str());
1300 for (int i = 0; phostent->h_addr_list[i] != NULL; i++)
1302 CAddress addr(*(unsigned int*)phostent->h_addr_list[i], GetDefaultPort(), nLocalServices);
1303 if (addr.IsValid() && addr.GetByte(3) != 127)
1305 addrLocalHost = addr;
1312 // Get local host ip
1313 struct ifaddrs* myaddrs;
1314 if (getifaddrs(&myaddrs) == 0)
1316 for (struct ifaddrs* ifa = myaddrs; ifa != NULL; ifa = ifa->ifa_next)
1318 if (ifa->ifa_addr == NULL) continue;
1319 if ((ifa->ifa_flags & IFF_UP) == 0) continue;
1320 if (strcmp(ifa->ifa_name, "lo") == 0) continue;
1321 if (strcmp(ifa->ifa_name, "lo0") == 0) continue;
1323 if (ifa->ifa_addr->sa_family == AF_INET)
1325 struct sockaddr_in* s4 = (struct sockaddr_in*)(ifa->ifa_addr);
1326 if (inet_ntop(ifa->ifa_addr->sa_family, (void*)&(s4->sin_addr), pszIP, sizeof(pszIP)) != NULL)
1327 printf("ipv4 %s: %s\n", ifa->ifa_name, pszIP);
1329 // Take the first IP that isn't loopback 127.x.x.x
1330 CAddress addr(*(unsigned int*)&s4->sin_addr, GetDefaultPort(), nLocalServices);
1331 if (addr.IsValid() && addr.GetByte(3) != 127)
1333 addrLocalHost = addr;
1337 else if (ifa->ifa_addr->sa_family == AF_INET6)
1339 struct sockaddr_in6* s6 = (struct sockaddr_in6*)(ifa->ifa_addr);
1340 if (inet_ntop(ifa->ifa_addr->sa_family, (void*)&(s6->sin6_addr), pszIP, sizeof(pszIP)) != NULL)
1341 printf("ipv6 %s: %s\n", ifa->ifa_name, pszIP);
1344 freeifaddrs(myaddrs);
1347 printf("addrLocalHost = %s\n", addrLocalHost.ToString().c_str());
1349 if (fUseProxy || mapArgs.count("-connect") || fNoListen)
1351 // Proxies can't take incoming connections
1352 addrLocalHost.ip = CAddress("0.0.0.0").ip;
1353 printf("addrLocalHost = %s\n", addrLocalHost.ToString().c_str());
1357 CreateThread(ThreadGetMyExternalIP, NULL);
1364 // Get addresses from IRC and advertise ours
1365 if (!CreateThread(ThreadIRCSeed, NULL))
1366 printf("Error: CreateThread(ThreadIRCSeed) failed\n");
1368 // Send and receive from sockets, accept connections
1369 pthread_t hThreadSocketHandler = CreateThread(ThreadSocketHandler, NULL, true);
1371 // Initiate outbound connections
1372 if (!CreateThread(ThreadOpenConnections, NULL))
1373 printf("Error: CreateThread(ThreadOpenConnections) failed\n");
1376 if (!CreateThread(ThreadMessageHandler, NULL))
1377 printf("Error: CreateThread(ThreadMessageHandler) failed\n");
1379 // Generate coins in the background
1380 GenerateBitcoins(fGenerateBitcoins);
1385 printf("StopNode()\n");
1387 nTransactionsUpdated++;
1388 int64 nStart = GetTime();
1389 while (vnThreadsRunning[0] > 0 || vnThreadsRunning[2] > 0 || vnThreadsRunning[3] > 0 || vnThreadsRunning[4] > 0)
1391 if (GetTime() - nStart > 20)
1395 if (vnThreadsRunning[0] > 0) printf("ThreadSocketHandler still running\n");
1396 if (vnThreadsRunning[1] > 0) printf("ThreadOpenConnections still running\n");
1397 if (vnThreadsRunning[2] > 0) printf("ThreadMessageHandler still running\n");
1398 if (vnThreadsRunning[3] > 0) printf("ThreadBitcoinMiner still running\n");
1399 if (vnThreadsRunning[4] > 0) printf("ThreadRPCServer still running\n");
1400 while (vnThreadsRunning[2] > 0 || vnThreadsRunning[4] > 0)
1416 foreach(CNode* pnode, vNodes)
1417 if (pnode->hSocket != INVALID_SOCKET)
1418 closesocket(pnode->hSocket);
1419 if (hListenSocket != INVALID_SOCKET)
1420 if (closesocket(hListenSocket) == SOCKET_ERROR)
1421 printf("closesocket(hListenSocket) failed with error %d\n", WSAGetLastError());
1424 // Shutdown Windows Sockets
1429 instance_of_cnetcleanup;