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);
693 CRITICAL_BLOCK(cs_vNodes)
694 foreach(CNode* pnode, vNodes)
697 if (hSocket == INVALID_SOCKET)
699 if (WSAGetLastError() != WSAEWOULDBLOCK)
700 printf("socket error accept failed: %d\n", WSAGetLastError());
702 else if (nInbound >= GetArg("-maxconnections", 125) - MAX_OUTBOUND_CONNECTIONS)
704 closesocket(hSocket);
708 printf("accepted connection %s\n", addr.ToStringLog().c_str());
709 CNode* pnode = new CNode(hSocket, addr, true);
711 CRITICAL_BLOCK(cs_vNodes)
712 vNodes.push_back(pnode);
718 // Service each socket
720 vector<CNode*> vNodesCopy;
721 CRITICAL_BLOCK(cs_vNodes)
724 foreach(CNode* pnode, vNodesCopy)
727 foreach(CNode* pnode, vNodesCopy)
735 if (pnode->hSocket == INVALID_SOCKET)
737 if (FD_ISSET(pnode->hSocket, &fdsetRecv) || FD_ISSET(pnode->hSocket, &fdsetError))
739 TRY_CRITICAL_BLOCK(pnode->cs_vRecv)
741 CDataStream& vRecv = pnode->vRecv;
742 unsigned int nPos = vRecv.size();
744 if (nPos > 1000*GetArg("-maxreceivebuffer", 10*1000)) {
745 if (!pnode->fDisconnect)
746 printf("socket recv flood control disconnect (%d bytes)\n", vRecv.size());
747 pnode->CloseSocketDisconnect();
750 // typical socket buffer is 8K-64K
751 char pchBuf[0x10000];
752 int nBytes = recv(pnode->hSocket, pchBuf, sizeof(pchBuf), MSG_DONTWAIT);
755 vRecv.resize(nPos + nBytes);
756 memcpy(&vRecv[nPos], pchBuf, nBytes);
757 pnode->nLastRecv = GetTime();
759 else if (nBytes == 0)
761 // socket closed gracefully
762 if (!pnode->fDisconnect)
763 printf("socket closed\n");
764 pnode->CloseSocketDisconnect();
769 int nErr = WSAGetLastError();
770 if (nErr != WSAEWOULDBLOCK && nErr != WSAEMSGSIZE && nErr != WSAEINTR && nErr != WSAEINPROGRESS)
772 if (!pnode->fDisconnect)
773 printf("socket recv error %d\n", nErr);
774 pnode->CloseSocketDisconnect();
784 if (pnode->hSocket == INVALID_SOCKET)
786 if (FD_ISSET(pnode->hSocket, &fdsetSend))
788 TRY_CRITICAL_BLOCK(pnode->cs_vSend)
790 CDataStream& vSend = pnode->vSend;
793 int nBytes = send(pnode->hSocket, &vSend[0], vSend.size(), MSG_NOSIGNAL | MSG_DONTWAIT);
796 vSend.erase(vSend.begin(), vSend.begin() + nBytes);
797 pnode->nLastSend = GetTime();
802 int nErr = WSAGetLastError();
803 if (nErr != WSAEWOULDBLOCK && nErr != WSAEMSGSIZE && nErr != WSAEINTR && nErr != WSAEINPROGRESS)
805 printf("socket send error %d\n", nErr);
806 pnode->CloseSocketDisconnect();
809 if (vSend.size() > 1000*GetArg("-maxsendbuffer", 10*1000)) {
810 if (!pnode->fDisconnect)
811 printf("socket send flood control disconnect (%d bytes)\n", vSend.size());
812 pnode->CloseSocketDisconnect();
819 // Inactivity checking
821 if (pnode->vSend.empty())
822 pnode->nLastSendEmpty = GetTime();
823 if (GetTime() - pnode->nTimeConnected > 60)
825 if (pnode->nLastRecv == 0 || pnode->nLastSend == 0)
827 printf("socket no message in first 60 seconds, %d %d\n", pnode->nLastRecv != 0, pnode->nLastSend != 0);
828 pnode->fDisconnect = true;
830 else if (GetTime() - pnode->nLastSend > 90*60 && GetTime() - pnode->nLastSendEmpty > 90*60)
832 printf("socket not sending\n");
833 pnode->fDisconnect = true;
835 else if (GetTime() - pnode->nLastRecv > 90*60)
837 printf("socket inactivity timeout\n");
838 pnode->fDisconnect = true;
842 CRITICAL_BLOCK(cs_vNodes)
844 foreach(CNode* pnode, vNodesCopy)
860 static const char *strDNSSeed[] = {
862 "bitseed.bitcoin.org.uk",
865 void DNSAddressSeed()
869 printf("Loading addresses from DNS seeds (could take a while)\n");
871 for (int seed_idx = 0; seed_idx < ARRAYLEN(strDNSSeed); seed_idx++) {
872 struct hostent* phostent = gethostbyname(strDNSSeed[seed_idx]);
876 for (int host = 0; phostent->h_addr_list[host] != NULL; host++) {
877 CAddress addr(*(unsigned int*)phostent->h_addr_list[host],
878 GetDefaultPort(), NODE_NETWORK);
880 if (addr.IsValid() && addr.GetByte(3) != 127) {
887 printf("%d addresses found from DNS seeds\n", found);
892 unsigned int pnSeed[] =
894 0x1ddb1032, 0x6242ce40, 0x52d6a445, 0x2dd7a445, 0x8a53cd47, 0x73263750, 0xda23c257, 0xecd4ed57,
895 0x0a40ec59, 0x75dce160, 0x7df76791, 0x89370bad, 0xa4f214ad, 0x767700ae, 0x638b0418, 0x868a1018,
896 0xcd9f332e, 0x0129653e, 0xcc92dc3e, 0x96671640, 0x56487e40, 0x5b66f440, 0xb1d01f41, 0xf1dc6041,
897 0xc1d12b42, 0x86ba1243, 0x6be4df43, 0x6d4cef43, 0xd18e0644, 0x1ab0b344, 0x6584a345, 0xe7c1a445,
898 0x58cea445, 0xc5daa445, 0x21dda445, 0x3d3b5346, 0x13e55347, 0x1080d24a, 0x8e611e4b, 0x81518e4b,
899 0x6c839e4b, 0xe2ad0a4c, 0xfbbc0a4c, 0x7f5b6e4c, 0x7244224e, 0x1300554e, 0x20690652, 0x5a48b652,
900 0x75c5c752, 0x4335cc54, 0x340fd154, 0x87c07455, 0x087b2b56, 0x8a133a57, 0xac23c257, 0x70374959,
901 0xfb63d45b, 0xb9a1685c, 0x180d765c, 0x674f645d, 0x04d3495e, 0x1de44b5e, 0x4ee8a362, 0x0ded1b63,
902 0xc1b04b6d, 0x8d921581, 0x97b7ea82, 0x1cf83a8e, 0x91490bad, 0x09dc75ae, 0x9a6d79ae, 0xa26d79ae,
903 0x0fd08fae, 0x0f3e3fb2, 0x4f944fb2, 0xcca448b8, 0x3ecd6ab8, 0xa9d5a5bc, 0x8d0119c1, 0x045997d5,
904 0xca019dd9, 0x0d526c4d, 0xabf1ba44, 0x66b1ab55, 0x1165f462, 0x3ed7cbad, 0xa38fae6e, 0x3bd2cbad,
905 0xd36f0547, 0x20df7840, 0x7a337742, 0x549f8e4b, 0x9062365c, 0xd399f562, 0x2b5274a1, 0x8edfa153,
906 0x3bffb347, 0x7074bf58, 0xb74fcbad, 0x5b5a795b, 0x02fa29ce, 0x5a6738d4, 0xe8a1d23e, 0xef98c445,
907 0x4b0f494c, 0xa2bc1e56, 0x7694ad63, 0xa4a800c3, 0x05fda6cd, 0x9f22175e, 0x364a795b, 0x536285d5,
908 0xac44c9d4, 0x0b06254d, 0x150c2fd4, 0x32a50dcc, 0xfd79ce48, 0xf15cfa53, 0x66c01e60, 0x6bc26661,
909 0xc03b47ae, 0x4dda1b81, 0x3285a4c1, 0x883ca96d, 0x35d60a4c, 0xdae09744, 0x2e314d61, 0x84e247cf,
910 0x6c814552, 0x3a1cc658, 0x98d8f382, 0xe584cb5b, 0x15e86057, 0x7b01504e, 0xd852dd48, 0x56382f56,
911 0x0a5df454, 0xa0d18d18, 0x2e89b148, 0xa79c114c, 0xcbdcd054, 0x5523bc43, 0xa9832640, 0x8a066144,
912 0x3894c3bc, 0xab76bf58, 0x6a018ac1, 0xfebf4f43, 0x2f26c658, 0x31102f4e, 0x85e929d5, 0x2a1c175e,
913 0xfc6c2cd1, 0x27b04b6d, 0xdf024650, 0x161748b8, 0x28be6580, 0x57be6580, 0x1cee677a, 0xaa6bb742,
914 0x9a53964b, 0x0a5a2d4d, 0x2434c658, 0x9a494f57, 0x1ebb0e48, 0xf610b85d, 0x077ecf44, 0x085128bc,
915 0x5ba17a18, 0x27ca1b42, 0xf8a00b56, 0xfcd4c257, 0xcf2fc15e, 0xd897e052, 0x4cada04f, 0x2f35f6d5,
916 0x382ce8c9, 0xe523984b, 0x3f946846, 0x60c8be43, 0x41da6257, 0xde0be142, 0xae8a544b, 0xeff0c254,
917 0x1e0f795b, 0xaeb28890, 0xca16acd9, 0x1e47ddd8, 0x8c8c4829, 0xd27dc747, 0xd53b1663, 0x4096b163,
918 0x9c8dd958, 0xcb12f860, 0x9e79305c, 0x40c1a445, 0x4a90c2bc, 0x2c3a464d, 0x2727f23c, 0x30b04b6d,
919 0x59024cb8, 0xa091e6ad, 0x31b04b6d, 0xc29d46a6, 0x63934fb2, 0xd9224dbe, 0x9f5910d8, 0x7f530a6b,
920 0x752e9c95, 0x65453548, 0xa484be46, 0xce5a1b59, 0x710e0718, 0x46a13d18, 0xdaaf5318, 0xc4a8ff53,
921 0x87abaa52, 0xb764cf51, 0xb2025d4a, 0x6d351e41, 0xc035c33e, 0xa432c162, 0x61ef34ae, 0xd16fddbc,
922 0x0870e8c1, 0x3070e8c1, 0x9c71e8c1, 0xa4992363, 0x85a1f663, 0x4184e559, 0x18d96ed8, 0x17b8dbd5,
923 0x60e7cd18, 0xe5ee104c, 0xab17ac62, 0x1e786e1b, 0x5d23b762, 0xf2388fae, 0x88270360, 0x9e5b3d80,
924 0x7da518b2, 0xb5613b45, 0x1ad41f3e, 0xd550854a, 0x8617e9a9, 0x925b229c, 0xf2e92542, 0x47af0544,
925 0x73b5a843, 0xb9b7a0ad, 0x03a748d0, 0x0a6ff862, 0x6694df62, 0x3bfac948, 0x8e098f4f, 0x746916c3,
926 0x02f38e4f, 0x40bb1243, 0x6a54d162, 0x6008414b, 0xa513794c, 0x514aa343, 0x63781747, 0xdbb6795b,
927 0xed065058, 0x42d24b46, 0x1518794c, 0x9b271681, 0x73e4ffad, 0x0654784f, 0x438dc945, 0x641846a6,
928 0x2d1b0944, 0x94b59148, 0x8d369558, 0xa5a97662, 0x8b705b42, 0xce9204ae, 0x8d584450, 0x2df61555,
929 0xeebff943, 0x2e75fb4d, 0x3ef8fc57, 0x9921135e, 0x8e31042e, 0xb5afad43, 0x89ecedd1, 0x9cfcc047,
930 0x8fcd0f4c, 0xbe49f5ad, 0x146a8d45, 0x98669ab8, 0x98d9175e, 0xd1a8e46d, 0x839a3ab8, 0x40a0016c,
931 0x6d27c257, 0x977fffad, 0x7baa5d5d, 0x1213be43, 0xb167e5a9, 0x640fe8ca, 0xbc9ea655, 0x0f820a4c,
932 0x0f097059, 0x69ac957c, 0x366d8453, 0xb1ba2844, 0x8857f081, 0x70b5be63, 0xc545454b, 0xaf36ded1,
933 0xb5a4b052, 0x21f062d1, 0x72ab89b2, 0x74a45318, 0x8312e6bc, 0xb916965f, 0x8aa7c858, 0xfe7effad,
938 void ThreadOpenConnections(void* parg)
940 IMPLEMENT_RANDOMIZE_STACK(ThreadOpenConnections(parg));
943 vnThreadsRunning[1]++;
944 ThreadOpenConnections2(parg);
945 vnThreadsRunning[1]--;
947 catch (std::exception& e) {
948 vnThreadsRunning[1]--;
949 PrintException(&e, "ThreadOpenConnections()");
951 vnThreadsRunning[1]--;
952 PrintException(NULL, "ThreadOpenConnections()");
954 printf("ThreadOpenConnections exiting\n");
957 void ThreadOpenConnections2(void* parg)
959 printf("ThreadOpenConnections started\n");
961 // Connect to specific addresses
962 if (mapArgs.count("-connect"))
964 for (int64 nLoop = 0;; nLoop++)
966 foreach(string strAddr, mapMultiArgs["-connect"])
968 CAddress addr(strAddr, NODE_NETWORK);
970 OpenNetworkConnection(addr);
971 for (int i = 0; i < 10 && i < nLoop; i++)
981 // Connect to manually added nodes first
982 if (mapArgs.count("-addnode"))
984 foreach(string strAddr, mapMultiArgs["-addnode"])
986 CAddress addr(strAddr, NODE_NETWORK);
989 OpenNetworkConnection(addr);
997 // Initiate network connections
998 int64 nStart = GetTime();
1001 // Limit outbound connections
1002 vnThreadsRunning[1]--;
1007 CRITICAL_BLOCK(cs_vNodes)
1008 foreach(CNode* pnode, vNodes)
1009 if (!pnode->fInbound)
1011 int nMaxOutboundConnections = MAX_OUTBOUND_CONNECTIONS;
1012 nMaxOutboundConnections = min(nMaxOutboundConnections, (int)GetArg("-maxconnections", 125));
1013 if (nOutbound < nMaxOutboundConnections)
1019 vnThreadsRunning[1]++;
1023 CRITICAL_BLOCK(cs_mapAddresses)
1025 // Add seed nodes if IRC isn't working
1026 static bool fSeedUsed;
1027 bool fTOR = (fUseProxy && addrProxy.port == htons(9050));
1028 if (mapAddresses.empty() && (GetTime() - nStart > 60 || fTOR) && !fTestNet)
1030 for (int i = 0; i < ARRAYLEN(pnSeed); i++)
1032 // It'll only connect to one or two seed nodes because once it connects,
1033 // it'll get a pile of addresses with newer timestamps.
1035 addr.ip = pnSeed[i];
1042 if (fSeedUsed && mapAddresses.size() > ARRAYLEN(pnSeed) + 100)
1044 // Disconnect seed nodes
1045 set<unsigned int> setSeed(pnSeed, pnSeed + ARRAYLEN(pnSeed));
1046 static int64 nSeedDisconnected;
1047 if (nSeedDisconnected == 0)
1049 nSeedDisconnected = GetTime();
1050 CRITICAL_BLOCK(cs_vNodes)
1051 foreach(CNode* pnode, vNodes)
1052 if (setSeed.count(pnode->addr.ip))
1053 pnode->fDisconnect = true;
1056 // Keep setting timestamps to 0 so they won't reconnect
1057 if (GetTime() - nSeedDisconnected < 60 * 60)
1059 foreach(PAIRTYPE(const vector<unsigned char>, CAddress)& item, mapAddresses)
1061 if (setSeed.count(item.second.ip) && item.second.nTime != 0)
1063 item.second.nTime = 0;
1064 CAddrDB().WriteAddress(item.second);
1073 // Choose an address to connect to based on most recently seen
1075 CAddress addrConnect;
1076 int64 nBest = INT64_MIN;
1078 // Only connect to one address per a.b.?.? range.
1079 // Do this here so we don't have to critsect vNodes inside mapAddresses critsect.
1080 set<unsigned int> setConnected;
1081 CRITICAL_BLOCK(cs_vNodes)
1082 foreach(CNode* pnode, vNodes)
1083 setConnected.insert(pnode->addr.ip & 0x0000ffff);
1085 CRITICAL_BLOCK(cs_mapAddresses)
1087 foreach(const PAIRTYPE(vector<unsigned char>, CAddress)& item, mapAddresses)
1089 const CAddress& addr = item.second;
1090 if (!addr.IsIPv4() || !addr.IsValid() || setConnected.count(addr.ip & 0x0000ffff))
1092 int64 nSinceLastSeen = GetAdjustedTime() - addr.nTime;
1093 int64 nSinceLastTry = GetAdjustedTime() - addr.nLastTry;
1095 // Randomize the order in a deterministic way, putting the standard port first
1096 int64 nRandomizer = (uint64)(nStart * 4951 + addr.nLastTry * 9567851 + addr.ip * 7789) % (2 * 60 * 60);
1097 if (addr.port != GetDefaultPort())
1098 nRandomizer += 2 * 60 * 60;
1100 // Last seen Base retry frequency
1109 // 365 days 93 hours
1110 int64 nDelay = (int64)(3600.0 * sqrt(fabs((double)nSinceLastSeen) / 3600.0) + nRandomizer);
1112 // Fast reconnect for one hour after last seen
1113 if (nSinceLastSeen < 60 * 60)
1116 // Limit retry frequency
1117 if (nSinceLastTry < nDelay)
1120 // If we have IRC, we'll be notified when they first come online,
1121 // and again every 24 hours by the refresh broadcast.
1122 if (nGotIRCAddresses > 0 && vNodes.size() >= 2 && nSinceLastSeen > 24 * 60 * 60)
1125 // Only try the old stuff if we don't have enough connections
1126 if (vNodes.size() >= 8 && nSinceLastSeen > 24 * 60 * 60)
1129 // If multiple addresses are ready, prioritize by time since
1130 // last seen and time since last tried.
1131 int64 nScore = min(nSinceLastTry, (int64)24 * 60 * 60) - nSinceLastSeen - nRandomizer;
1140 if (addrConnect.IsValid())
1141 OpenNetworkConnection(addrConnect);
1145 bool OpenNetworkConnection(const CAddress& addrConnect)
1148 // Initiate outbound network connection
1152 if (addrConnect.ip == addrLocalHost.ip || !addrConnect.IsIPv4() || FindNode(addrConnect.ip))
1155 vnThreadsRunning[1]--;
1156 CNode* pnode = ConnectNode(addrConnect);
1157 vnThreadsRunning[1]++;
1162 pnode->fNetworkNode = true;
1174 void ThreadMessageHandler(void* parg)
1176 IMPLEMENT_RANDOMIZE_STACK(ThreadMessageHandler(parg));
1179 vnThreadsRunning[2]++;
1180 ThreadMessageHandler2(parg);
1181 vnThreadsRunning[2]--;
1183 catch (std::exception& e) {
1184 vnThreadsRunning[2]--;
1185 PrintException(&e, "ThreadMessageHandler()");
1187 vnThreadsRunning[2]--;
1188 PrintException(NULL, "ThreadMessageHandler()");
1190 printf("ThreadMessageHandler exiting\n");
1193 void ThreadMessageHandler2(void* parg)
1195 printf("ThreadMessageHandler started\n");
1196 SetThreadPriority(THREAD_PRIORITY_BELOW_NORMAL);
1199 vector<CNode*> vNodesCopy;
1200 CRITICAL_BLOCK(cs_vNodes)
1202 vNodesCopy = vNodes;
1203 foreach(CNode* pnode, vNodesCopy)
1207 // Poll the connected nodes for messages
1208 CNode* pnodeTrickle = NULL;
1209 if (!vNodesCopy.empty())
1210 pnodeTrickle = vNodesCopy[GetRand(vNodesCopy.size())];
1211 foreach(CNode* pnode, vNodesCopy)
1214 TRY_CRITICAL_BLOCK(pnode->cs_vRecv)
1215 ProcessMessages(pnode);
1220 TRY_CRITICAL_BLOCK(pnode->cs_vSend)
1221 SendMessages(pnode, pnode == pnodeTrickle);
1226 CRITICAL_BLOCK(cs_vNodes)
1228 foreach(CNode* pnode, vNodesCopy)
1232 // Wait and allow messages to bunch up.
1233 // Reduce vnThreadsRunning so StopNode has permission to exit while
1234 // we're sleeping, but we must always check fShutdown after doing this.
1235 vnThreadsRunning[2]--;
1237 if (fRequestShutdown)
1239 vnThreadsRunning[2]++;
1253 bool BindListenPort(string& strError)
1257 addrLocalHost.port = GetDefaultPort();
1260 // Initialize Windows Sockets
1262 int ret = WSAStartup(MAKEWORD(2,2), &wsadata);
1263 if (ret != NO_ERROR)
1265 strError = strprintf("Error: TCP/IP socket library failed to start (WSAStartup returned error %d)", ret);
1266 printf("%s\n", strError.c_str());
1271 // Create socket for listening for incoming connections
1272 hListenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
1273 if (hListenSocket == INVALID_SOCKET)
1275 strError = strprintf("Error: Couldn't open socket for incoming connections (socket returned error %d)", WSAGetLastError());
1276 printf("%s\n", strError.c_str());
1281 // Different way of disabling SIGPIPE on BSD
1282 setsockopt(hListenSocket, SOL_SOCKET, SO_NOSIGPIPE, (void*)&nOne, sizeof(int));
1286 // Allow binding if the port is still in TIME_WAIT state after
1287 // the program was closed and restarted. Not an issue on windows.
1288 setsockopt(hListenSocket, SOL_SOCKET, SO_REUSEADDR, (void*)&nOne, sizeof(int));
1292 // Set to nonblocking, incoming connections will also inherit this
1293 if (ioctlsocket(hListenSocket, FIONBIO, (u_long*)&nOne) == SOCKET_ERROR)
1295 if (fcntl(hListenSocket, F_SETFL, O_NONBLOCK) == SOCKET_ERROR)
1298 strError = strprintf("Error: Couldn't set properties on socket for incoming connections (error %d)", WSAGetLastError());
1299 printf("%s\n", strError.c_str());
1303 // The sockaddr_in structure specifies the address family,
1304 // IP address, and port for the socket that is being bound
1305 struct sockaddr_in sockaddr;
1306 memset(&sockaddr, 0, sizeof(sockaddr));
1307 sockaddr.sin_family = AF_INET;
1308 sockaddr.sin_addr.s_addr = INADDR_ANY; // bind to all IPs on this computer
1309 sockaddr.sin_port = GetDefaultPort();
1310 if (::bind(hListenSocket, (struct sockaddr*)&sockaddr, sizeof(sockaddr)) == SOCKET_ERROR)
1312 int nErr = WSAGetLastError();
1313 if (nErr == WSAEADDRINUSE)
1314 strError = strprintf(_("Unable to bind to port %d on this computer. Bitcoin is probably already running."), ntohs(sockaddr.sin_port));
1316 strError = strprintf("Error: Unable to bind to port %d on this computer (bind returned error %d)", ntohs(sockaddr.sin_port), nErr);
1317 printf("%s\n", strError.c_str());
1320 printf("Bound to port %d\n", ntohs(sockaddr.sin_port));
1322 // Listen for incoming connections
1323 if (listen(hListenSocket, SOMAXCONN) == SOCKET_ERROR)
1325 strError = strprintf("Error: Listening for incoming connections failed (listen returned error %d)", WSAGetLastError());
1326 printf("%s\n", strError.c_str());
1333 void StartNode(void* parg)
1335 if (pnodeLocalHost == NULL)
1336 pnodeLocalHost = new CNode(INVALID_SOCKET, CAddress("127.0.0.1", nLocalServices));
1339 // Get local host ip
1340 char pszHostName[1000] = "";
1341 if (gethostname(pszHostName, sizeof(pszHostName)) != SOCKET_ERROR)
1343 struct hostent* phostent = gethostbyname(pszHostName);
1346 // Take the first IP that isn't loopback 127.x.x.x
1347 for (int i = 0; phostent->h_addr_list[i] != NULL; i++)
1348 printf("host ip %d: %s\n", i, CAddress(*(unsigned int*)phostent->h_addr_list[i]).ToStringIP().c_str());
1349 for (int i = 0; phostent->h_addr_list[i] != NULL; i++)
1351 CAddress addr(*(unsigned int*)phostent->h_addr_list[i], GetDefaultPort(), nLocalServices);
1352 if (addr.IsValid() && addr.GetByte(3) != 127)
1354 addrLocalHost = addr;
1361 // Get local host ip
1362 struct ifaddrs* myaddrs;
1363 if (getifaddrs(&myaddrs) == 0)
1365 for (struct ifaddrs* ifa = myaddrs; ifa != NULL; ifa = ifa->ifa_next)
1367 if (ifa->ifa_addr == NULL) continue;
1368 if ((ifa->ifa_flags & IFF_UP) == 0) continue;
1369 if (strcmp(ifa->ifa_name, "lo") == 0) continue;
1370 if (strcmp(ifa->ifa_name, "lo0") == 0) continue;
1372 if (ifa->ifa_addr->sa_family == AF_INET)
1374 struct sockaddr_in* s4 = (struct sockaddr_in*)(ifa->ifa_addr);
1375 if (inet_ntop(ifa->ifa_addr->sa_family, (void*)&(s4->sin_addr), pszIP, sizeof(pszIP)) != NULL)
1376 printf("ipv4 %s: %s\n", ifa->ifa_name, pszIP);
1378 // Take the first IP that isn't loopback 127.x.x.x
1379 CAddress addr(*(unsigned int*)&s4->sin_addr, GetDefaultPort(), nLocalServices);
1380 if (addr.IsValid() && addr.GetByte(3) != 127)
1382 addrLocalHost = addr;
1386 else if (ifa->ifa_addr->sa_family == AF_INET6)
1388 struct sockaddr_in6* s6 = (struct sockaddr_in6*)(ifa->ifa_addr);
1389 if (inet_ntop(ifa->ifa_addr->sa_family, (void*)&(s6->sin6_addr), pszIP, sizeof(pszIP)) != NULL)
1390 printf("ipv6 %s: %s\n", ifa->ifa_name, pszIP);
1393 freeifaddrs(myaddrs);
1396 printf("addrLocalHost = %s\n", addrLocalHost.ToString().c_str());
1398 if (fUseProxy || mapArgs.count("-connect") || fNoListen)
1400 // Proxies can't take incoming connections
1401 addrLocalHost.ip = CAddress("0.0.0.0").ip;
1402 printf("addrLocalHost = %s\n", addrLocalHost.ToString().c_str());
1406 CreateThread(ThreadGetMyExternalIP, NULL);
1413 // Get addresses from IRC and advertise ours
1414 if (!CreateThread(ThreadIRCSeed, NULL))
1415 printf("Error: CreateThread(ThreadIRCSeed) failed\n");
1417 // Send and receive from sockets, accept connections
1418 pthread_t hThreadSocketHandler = CreateThread(ThreadSocketHandler, NULL, true);
1420 // Initiate outbound connections
1421 if (!CreateThread(ThreadOpenConnections, NULL))
1422 printf("Error: CreateThread(ThreadOpenConnections) failed\n");
1425 if (!CreateThread(ThreadMessageHandler, NULL))
1426 printf("Error: CreateThread(ThreadMessageHandler) failed\n");
1428 // Generate coins in the background
1429 GenerateBitcoins(fGenerateBitcoins);
1434 printf("StopNode()\n");
1436 nTransactionsUpdated++;
1437 int64 nStart = GetTime();
1438 while (vnThreadsRunning[0] > 0 || vnThreadsRunning[2] > 0 || vnThreadsRunning[3] > 0 || vnThreadsRunning[4] > 0)
1440 if (GetTime() - nStart > 20)
1444 if (vnThreadsRunning[0] > 0) printf("ThreadSocketHandler still running\n");
1445 if (vnThreadsRunning[1] > 0) printf("ThreadOpenConnections still running\n");
1446 if (vnThreadsRunning[2] > 0) printf("ThreadMessageHandler still running\n");
1447 if (vnThreadsRunning[3] > 0) printf("ThreadBitcoinMiner still running\n");
1448 if (vnThreadsRunning[4] > 0) printf("ThreadRPCServer still running\n");
1449 while (vnThreadsRunning[2] > 0 || vnThreadsRunning[4] > 0)
1465 foreach(CNode* pnode, vNodes)
1466 if (pnode->hSocket != INVALID_SOCKET)
1467 closesocket(pnode->hSocket);
1468 if (hListenSocket != INVALID_SOCKET)
1469 if (closesocket(hListenSocket) == SOCKET_ERROR)
1470 printf("closesocket(hListenSocket) failed with error %d\n", WSAGetLastError());
1473 // Shutdown Windows Sockets
1478 instance_of_cnetcleanup;