Mercurial > hg > bitcoin
annotate net.cpp @ 279:f70e033b871e draft
Russian translation by eurekafag
git-svn-id: https://bitcoin.svn.sourceforge.net/svnroot/bitcoin/trunk@160 1a98c847-1fd6-4fd8-948a-caf3550aa51b
author | s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b> |
---|---|
date | Mon, 04 Oct 2010 01:40:50 +0000 |
parents | ae8c8d8f84bf |
children | 3590ce33a6a3 cecaa790a23e |
rev | line source |
---|---|
264
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1 // Copyright (c) 2009-2010 Satoshi Nakamoto |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
2 // Distributed under the MIT/X11 software license, see the accompanying |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
3 // file license.txt or http://www.opensource.org/licenses/mit-license.php. |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
4 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
5 #include "headers.h" |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
6 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
7 static const int MAX_OUTBOUND_CONNECTIONS = 8; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
8 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
9 void ThreadMessageHandler2(void* parg); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
10 void ThreadSocketHandler2(void* parg); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
11 void ThreadOpenConnections2(void* parg); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
12 bool OpenNetworkConnection(const CAddress& addrConnect); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
13 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
14 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
15 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
16 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
17 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
18 // |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
19 // Global state variables |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
20 // |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
21 bool fClient = false; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
22 uint64 nLocalServices = (fClient ? 0 : NODE_NETWORK); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
23 CAddress addrLocalHost(0, DEFAULT_PORT, nLocalServices); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
24 CNode* pnodeLocalHost = NULL; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
25 uint64 nLocalHostNonce = 0; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
26 array<int, 10> vnThreadsRunning; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
27 SOCKET hListenSocket = INVALID_SOCKET; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
28 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
29 vector<CNode*> vNodes; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
30 CCriticalSection cs_vNodes; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
31 map<vector<unsigned char>, CAddress> mapAddresses; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
32 CCriticalSection cs_mapAddresses; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
33 map<CInv, CDataStream> mapRelay; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
34 deque<pair<int64, CInv> > vRelayExpiration; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
35 CCriticalSection cs_mapRelay; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
36 map<CInv, int64> mapAlreadyAskedFor; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
37 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
38 // Settings |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
39 int fUseProxy = false; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
40 CAddress addrProxy("127.0.0.1:9050"); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
41 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
42 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
43 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
44 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
45 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
46 void CNode::PushGetBlocks(CBlockIndex* pindexBegin, uint256 hashEnd) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
47 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
48 // Filter out duplicate requests |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
49 if (pindexBegin == pindexLastGetBlocksBegin && hashEnd == hashLastGetBlocksEnd) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
50 return; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
51 pindexLastGetBlocksBegin = pindexBegin; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
52 hashLastGetBlocksEnd = hashEnd; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
53 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
54 PushMessage("getblocks", CBlockLocator(pindexBegin), hashEnd); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
55 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
56 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
57 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
58 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
59 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
60 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
61 bool ConnectSocket(const CAddress& addrConnect, SOCKET& hSocketRet) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
62 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
63 hSocketRet = INVALID_SOCKET; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
64 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
65 SOCKET hSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
66 if (hSocket == INVALID_SOCKET) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
67 return false; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
68 #ifdef BSD |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
69 int set = 1; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
70 setsockopt(hSocket, SOL_SOCKET, SO_NOSIGPIPE, (void*)&set, sizeof(int)); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
71 #endif |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
72 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
73 bool fRoutable = !(addrConnect.GetByte(3) == 10 || (addrConnect.GetByte(3) == 192 && addrConnect.GetByte(2) == 168)); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
74 bool fProxy = (fUseProxy && fRoutable); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
75 struct sockaddr_in sockaddr = (fProxy ? addrProxy.GetSockAddr() : addrConnect.GetSockAddr()); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
76 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
77 if (connect(hSocket, (struct sockaddr*)&sockaddr, sizeof(sockaddr)) == SOCKET_ERROR) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
78 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
79 closesocket(hSocket); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
80 return false; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
81 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
82 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
83 if (fProxy) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
84 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
85 printf("proxy connecting %s\n", addrConnect.ToStringLog().c_str()); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
86 char pszSocks4IP[] = "\4\1\0\0\0\0\0\0user"; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
87 memcpy(pszSocks4IP + 2, &addrConnect.port, 2); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
88 memcpy(pszSocks4IP + 4, &addrConnect.ip, 4); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
89 char* pszSocks4 = pszSocks4IP; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
90 int nSize = sizeof(pszSocks4IP); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
91 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
92 int ret = send(hSocket, pszSocks4, nSize, MSG_NOSIGNAL); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
93 if (ret != nSize) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
94 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
95 closesocket(hSocket); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
96 return error("Error sending to proxy"); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
97 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
98 char pchRet[8]; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
99 if (recv(hSocket, pchRet, 8, 0) != 8) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
100 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
101 closesocket(hSocket); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
102 return error("Error reading proxy response"); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
103 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
104 if (pchRet[1] != 0x5a) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
105 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
106 closesocket(hSocket); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
107 if (pchRet[1] != 0x5b) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
108 printf("ERROR: Proxy returned error %d\n", pchRet[1]); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
109 return false; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
110 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
111 printf("proxy connected %s\n", addrConnect.ToStringLog().c_str()); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
112 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
113 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
114 hSocketRet = hSocket; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
115 return true; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
116 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
117 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
118 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
119 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
120 bool GetMyExternalIP2(const CAddress& addrConnect, const char* pszGet, const char* pszKeyword, unsigned int& ipRet) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
121 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
122 SOCKET hSocket; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
123 if (!ConnectSocket(addrConnect, hSocket)) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
124 return error("GetMyExternalIP() : connection to %s failed", addrConnect.ToString().c_str()); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
125 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
126 send(hSocket, pszGet, strlen(pszGet), MSG_NOSIGNAL); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
127 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
128 string strLine; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
129 while (RecvLine(hSocket, strLine)) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
130 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
131 if (strLine.empty()) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
132 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
133 loop |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
134 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
135 if (!RecvLine(hSocket, strLine)) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
136 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
137 closesocket(hSocket); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
138 return false; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
139 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
140 if (strLine.find(pszKeyword) != -1) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
141 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
142 strLine = strLine.substr(strLine.find(pszKeyword) + strlen(pszKeyword)); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
143 break; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
144 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
145 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
146 closesocket(hSocket); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
147 if (strLine.find("<")) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
148 strLine = strLine.substr(0, strLine.find("<")); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
149 strLine = strLine.substr(strspn(strLine.c_str(), " \t\n\r")); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
150 while (strLine.size() > 0 && isspace(strLine[strLine.size()-1])) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
151 strLine.resize(strLine.size()-1); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
152 CAddress addr(strLine.c_str()); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
153 printf("GetMyExternalIP() received [%s] %s\n", strLine.c_str(), addr.ToString().c_str()); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
154 if (addr.ip == 0 || addr.ip == INADDR_NONE || !addr.IsRoutable()) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
155 return false; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
156 ipRet = addr.ip; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
157 return true; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
158 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
159 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
160 closesocket(hSocket); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
161 return error("GetMyExternalIP() : connection closed"); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
162 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
163 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
164 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
165 bool GetMyExternalIP(unsigned int& ipRet) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
166 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
167 CAddress addrConnect; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
168 const char* pszGet; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
169 const char* pszKeyword; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
170 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
171 if (fUseProxy) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
172 return false; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
173 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
174 for (int nLookup = 0; nLookup <= 1; nLookup++) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
175 for (int nHost = 1; nHost <= 2; nHost++) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
176 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
177 if (nHost == 1) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
178 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
179 addrConnect = CAddress("70.86.96.218:80"); // www.ipaddressworld.com |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
180 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
181 if (nLookup == 1) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
182 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
183 struct hostent* phostent = gethostbyname("www.ipaddressworld.com"); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
184 if (phostent && phostent->h_addr_list && phostent->h_addr_list[0]) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
185 addrConnect = CAddress(*(u_long*)phostent->h_addr_list[0], htons(80)); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
186 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
187 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
188 pszGet = "GET /ip.php HTTP/1.1\r\n" |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
189 "Host: www.ipaddressworld.com\r\n" |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
190 "User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)\r\n" |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
191 "Connection: close\r\n" |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
192 "\r\n"; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
193 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
194 pszKeyword = "IP:"; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
195 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
196 else if (nHost == 2) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
197 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
198 addrConnect = CAddress("208.78.68.70:80"); // checkip.dyndns.org |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
199 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
200 if (nLookup == 1) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
201 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
202 struct hostent* phostent = gethostbyname("checkip.dyndns.org"); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
203 if (phostent && phostent->h_addr_list && phostent->h_addr_list[0]) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
204 addrConnect = CAddress(*(u_long*)phostent->h_addr_list[0], htons(80)); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
205 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
206 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
207 pszGet = "GET / HTTP/1.1\r\n" |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
208 "Host: checkip.dyndns.org\r\n" |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
209 "User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)\r\n" |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
210 "Connection: close\r\n" |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
211 "\r\n"; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
212 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
213 pszKeyword = "Address:"; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
214 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
215 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
216 if (GetMyExternalIP2(addrConnect, pszGet, pszKeyword, ipRet)) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
217 return true; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
218 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
219 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
220 return false; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
221 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
222 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
223 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
224 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
225 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
226 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
227 bool AddAddress(CAddress addr) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
228 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
229 if (!addr.IsRoutable()) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
230 return false; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
231 if (addr.ip == addrLocalHost.ip) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
232 return false; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
233 CRITICAL_BLOCK(cs_mapAddresses) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
234 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
235 map<vector<unsigned char>, CAddress>::iterator it = mapAddresses.find(addr.GetKey()); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
236 if (it == mapAddresses.end()) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
237 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
238 // New address |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
239 printf("AddAddress(%s)\n", addr.ToStringLog().c_str()); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
240 mapAddresses.insert(make_pair(addr.GetKey(), addr)); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
241 CAddrDB().WriteAddress(addr); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
242 return true; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
243 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
244 else |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
245 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
246 bool fUpdated = false; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
247 CAddress& addrFound = (*it).second; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
248 if ((addrFound.nServices | addr.nServices) != addrFound.nServices) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
249 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
250 // Services have been added |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
251 addrFound.nServices |= addr.nServices; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
252 fUpdated = true; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
253 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
254 bool fCurrentlyOnline = (GetAdjustedTime() - addr.nTime < 24 * 60 * 60); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
255 int64 nUpdateInterval = (fCurrentlyOnline ? 60 * 60 : 24 * 60 * 60); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
256 if (addrFound.nTime < addr.nTime - nUpdateInterval) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
257 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
258 // Periodically update most recently seen time |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
259 addrFound.nTime = addr.nTime; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
260 fUpdated = true; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
261 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
262 if (fUpdated) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
263 CAddrDB().WriteAddress(addrFound); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
264 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
265 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
266 return false; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
267 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
268 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
269 void AddressCurrentlyConnected(const CAddress& addr) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
270 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
271 CRITICAL_BLOCK(cs_mapAddresses) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
272 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
273 // Only if it's been published already |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
274 map<vector<unsigned char>, CAddress>::iterator it = mapAddresses.find(addr.GetKey()); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
275 if (it != mapAddresses.end()) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
276 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
277 CAddress& addrFound = (*it).second; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
278 int64 nUpdateInterval = 20 * 60; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
279 if (addrFound.nTime < GetAdjustedTime() - nUpdateInterval) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
280 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
281 // Periodically update most recently seen time |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
282 addrFound.nTime = GetAdjustedTime(); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
283 CAddrDB addrdb; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
284 addrdb.WriteAddress(addrFound); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
285 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
286 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
287 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
288 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
289 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
290 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
291 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
292 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
293 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
294 void AbandonRequests(void (*fn)(void*, CDataStream&), void* param1) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
295 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
296 // If the dialog might get closed before the reply comes back, |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
297 // call this in the destructor so it doesn't get called after it's deleted. |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
298 CRITICAL_BLOCK(cs_vNodes) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
299 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
300 foreach(CNode* pnode, vNodes) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
301 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
302 CRITICAL_BLOCK(pnode->cs_mapRequests) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
303 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
304 for (map<uint256, CRequestTracker>::iterator mi = pnode->mapRequests.begin(); mi != pnode->mapRequests.end();) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
305 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
306 CRequestTracker& tracker = (*mi).second; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
307 if (tracker.fn == fn && tracker.param1 == param1) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
308 pnode->mapRequests.erase(mi++); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
309 else |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
310 mi++; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
311 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
312 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
313 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
314 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
315 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
316 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
317 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
318 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
319 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
320 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
321 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
322 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
323 // |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
324 // Subscription methods for the broadcast and subscription system. |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
325 // Channel numbers are message numbers, i.e. MSG_TABLE and MSG_PRODUCT. |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
326 // |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
327 // The subscription system uses a meet-in-the-middle strategy. |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
328 // With 100,000 nodes, if senders broadcast to 1000 random nodes and receivers |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
329 // subscribe to 1000 random nodes, 99.995% (1 - 0.99^1000) of messages will get through. |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
330 // |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
331 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
332 bool AnySubscribed(unsigned int nChannel) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
333 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
334 if (pnodeLocalHost->IsSubscribed(nChannel)) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
335 return true; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
336 CRITICAL_BLOCK(cs_vNodes) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
337 foreach(CNode* pnode, vNodes) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
338 if (pnode->IsSubscribed(nChannel)) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
339 return true; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
340 return false; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
341 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
342 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
343 bool CNode::IsSubscribed(unsigned int nChannel) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
344 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
345 if (nChannel >= vfSubscribe.size()) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
346 return false; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
347 return vfSubscribe[nChannel]; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
348 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
349 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
350 void CNode::Subscribe(unsigned int nChannel, unsigned int nHops) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
351 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
352 if (nChannel >= vfSubscribe.size()) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
353 return; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
354 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
355 if (!AnySubscribed(nChannel)) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
356 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
357 // Relay subscribe |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
358 CRITICAL_BLOCK(cs_vNodes) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
359 foreach(CNode* pnode, vNodes) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
360 if (pnode != this) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
361 pnode->PushMessage("subscribe", nChannel, nHops); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
362 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
363 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
364 vfSubscribe[nChannel] = true; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
365 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
366 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
367 void CNode::CancelSubscribe(unsigned int nChannel) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
368 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
369 if (nChannel >= vfSubscribe.size()) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
370 return; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
371 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
372 // Prevent from relaying cancel if wasn't subscribed |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
373 if (!vfSubscribe[nChannel]) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
374 return; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
375 vfSubscribe[nChannel] = false; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
376 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
377 if (!AnySubscribed(nChannel)) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
378 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
379 // Relay subscription cancel |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
380 CRITICAL_BLOCK(cs_vNodes) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
381 foreach(CNode* pnode, vNodes) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
382 if (pnode != this) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
383 pnode->PushMessage("sub-cancel", nChannel); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
384 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
385 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
386 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
387 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
388 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
389 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
390 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
391 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
392 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
393 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
394 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
395 CNode* FindNode(unsigned int ip) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
396 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
397 CRITICAL_BLOCK(cs_vNodes) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
398 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
399 foreach(CNode* pnode, vNodes) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
400 if (pnode->addr.ip == ip) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
401 return (pnode); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
402 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
403 return NULL; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
404 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
405 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
406 CNode* FindNode(CAddress addr) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
407 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
408 CRITICAL_BLOCK(cs_vNodes) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
409 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
410 foreach(CNode* pnode, vNodes) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
411 if (pnode->addr == addr) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
412 return (pnode); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
413 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
414 return NULL; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
415 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
416 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
417 CNode* ConnectNode(CAddress addrConnect, int64 nTimeout) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
418 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
419 if (addrConnect.ip == addrLocalHost.ip) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
420 return NULL; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
421 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
422 // Look for an existing connection |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
423 CNode* pnode = FindNode(addrConnect.ip); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
424 if (pnode) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
425 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
426 if (nTimeout != 0) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
427 pnode->AddRef(nTimeout); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
428 else |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
429 pnode->AddRef(); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
430 return pnode; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
431 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
432 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
433 /// debug print |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
434 printf("trying connection %s lastseen=%.1fhrs lasttry=%.1fhrs\n", |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
435 addrConnect.ToStringLog().c_str(), |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
436 (double)(addrConnect.nTime - GetAdjustedTime())/3600.0, |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
437 (double)(addrConnect.nLastTry - GetAdjustedTime())/3600.0); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
438 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
439 CRITICAL_BLOCK(cs_mapAddresses) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
440 mapAddresses[addrConnect.GetKey()].nLastTry = GetAdjustedTime(); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
441 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
442 // Connect |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
443 SOCKET hSocket; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
444 if (ConnectSocket(addrConnect, hSocket)) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
445 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
446 /// debug print |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
447 printf("connected %s\n", addrConnect.ToStringLog().c_str()); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
448 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
449 // Set to nonblocking |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
450 #ifdef __WXMSW__ |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
451 u_long nOne = 1; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
452 if (ioctlsocket(hSocket, FIONBIO, &nOne) == SOCKET_ERROR) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
453 printf("ConnectSocket() : ioctlsocket nonblocking setting failed, error %d\n", WSAGetLastError()); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
454 #else |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
455 if (fcntl(hSocket, F_SETFL, O_NONBLOCK) == SOCKET_ERROR) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
456 printf("ConnectSocket() : fcntl nonblocking setting failed, error %d\n", errno); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
457 #endif |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
458 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
459 // Add node |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
460 CNode* pnode = new CNode(hSocket, addrConnect, false); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
461 if (nTimeout != 0) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
462 pnode->AddRef(nTimeout); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
463 else |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
464 pnode->AddRef(); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
465 CRITICAL_BLOCK(cs_vNodes) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
466 vNodes.push_back(pnode); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
467 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
468 pnode->nTimeConnected = GetTime(); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
469 return pnode; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
470 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
471 else |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
472 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
473 return NULL; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
474 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
475 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
476 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
477 void CNode::CloseSocketDisconnect() |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
478 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
479 fDisconnect = true; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
480 if (hSocket != INVALID_SOCKET) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
481 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
482 if (fDebug) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
483 printf("%s ", DateTimeStrFormat("%x %H:%M:%S", GetTime()).c_str()); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
484 printf("disconnecting node %s\n", addr.ToStringLog().c_str()); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
485 closesocket(hSocket); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
486 hSocket = INVALID_SOCKET; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
487 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
488 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
489 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
490 void CNode::Cleanup() |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
491 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
492 // All of a nodes broadcasts and subscriptions are automatically torn down |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
493 // when it goes down, so a node has to stay up to keep its broadcast going. |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
494 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
495 // Cancel subscriptions |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
496 for (unsigned int nChannel = 0; nChannel < vfSubscribe.size(); nChannel++) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
497 if (vfSubscribe[nChannel]) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
498 CancelSubscribe(nChannel); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
499 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
500 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
501 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
502 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
503 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
504 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
505 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
506 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
507 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
508 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
509 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
510 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
511 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
512 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
513 void ThreadSocketHandler(void* parg) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
514 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
515 IMPLEMENT_RANDOMIZE_STACK(ThreadSocketHandler(parg)); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
516 try |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
517 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
518 vnThreadsRunning[0]++; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
519 ThreadSocketHandler2(parg); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
520 vnThreadsRunning[0]--; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
521 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
522 catch (std::exception& e) { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
523 vnThreadsRunning[0]--; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
524 PrintException(&e, "ThreadSocketHandler()"); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
525 } catch (...) { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
526 vnThreadsRunning[0]--; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
527 throw; // support pthread_cancel() |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
528 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
529 printf("ThreadSocketHandler exiting\n"); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
530 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
531 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
532 void ThreadSocketHandler2(void* parg) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
533 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
534 printf("ThreadSocketHandler started\n"); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
535 list<CNode*> vNodesDisconnected; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
536 int nPrevNodeCount = 0; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
537 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
538 loop |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
539 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
540 // |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
541 // Disconnect nodes |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
542 // |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
543 CRITICAL_BLOCK(cs_vNodes) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
544 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
545 // Disconnect unused nodes |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
546 vector<CNode*> vNodesCopy = vNodes; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
547 foreach(CNode* pnode, vNodesCopy) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
548 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
549 if (pnode->fDisconnect || |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
550 (pnode->GetRefCount() <= 0 && pnode->vRecv.empty() && pnode->vSend.empty())) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
551 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
552 // remove from vNodes |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
553 vNodes.erase(remove(vNodes.begin(), vNodes.end(), pnode), vNodes.end()); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
554 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
555 // close socket and cleanup |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
556 pnode->CloseSocketDisconnect(); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
557 pnode->Cleanup(); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
558 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
559 // hold in disconnected pool until all refs are released |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
560 pnode->nReleaseTime = max(pnode->nReleaseTime, GetTime() + 15 * 60); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
561 if (pnode->fNetworkNode || pnode->fInbound) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
562 pnode->Release(); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
563 vNodesDisconnected.push_back(pnode); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
564 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
565 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
566 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
567 // Delete disconnected nodes |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
568 list<CNode*> vNodesDisconnectedCopy = vNodesDisconnected; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
569 foreach(CNode* pnode, vNodesDisconnectedCopy) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
570 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
571 // wait until threads are done using it |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
572 if (pnode->GetRefCount() <= 0) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
573 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
574 bool fDelete = false; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
575 TRY_CRITICAL_BLOCK(pnode->cs_vSend) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
576 TRY_CRITICAL_BLOCK(pnode->cs_vRecv) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
577 TRY_CRITICAL_BLOCK(pnode->cs_mapRequests) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
578 TRY_CRITICAL_BLOCK(pnode->cs_inventory) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
579 fDelete = true; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
580 if (fDelete) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
581 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
582 vNodesDisconnected.remove(pnode); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
583 delete pnode; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
584 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
585 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
586 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
587 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
588 if (vNodes.size() != nPrevNodeCount) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
589 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
590 nPrevNodeCount = vNodes.size(); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
591 MainFrameRepaint(); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
592 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
593 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
594 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
595 // |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
596 // Find which sockets have data to receive |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
597 // |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
598 struct timeval timeout; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
599 timeout.tv_sec = 0; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
600 timeout.tv_usec = 50000; // frequency to poll pnode->vSend |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
601 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
602 fd_set fdsetRecv; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
603 fd_set fdsetSend; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
604 fd_set fdsetError; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
605 FD_ZERO(&fdsetRecv); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
606 FD_ZERO(&fdsetSend); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
607 FD_ZERO(&fdsetError); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
608 SOCKET hSocketMax = 0; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
609 FD_SET(hListenSocket, &fdsetRecv); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
610 hSocketMax = max(hSocketMax, hListenSocket); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
611 CRITICAL_BLOCK(cs_vNodes) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
612 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
613 foreach(CNode* pnode, vNodes) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
614 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
615 if (pnode->hSocket == INVALID_SOCKET || pnode->hSocket < 0) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
616 continue; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
617 FD_SET(pnode->hSocket, &fdsetRecv); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
618 FD_SET(pnode->hSocket, &fdsetError); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
619 hSocketMax = max(hSocketMax, pnode->hSocket); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
620 TRY_CRITICAL_BLOCK(pnode->cs_vSend) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
621 if (!pnode->vSend.empty()) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
622 FD_SET(pnode->hSocket, &fdsetSend); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
623 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
624 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
625 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
626 vnThreadsRunning[0]--; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
627 int nSelect = select(hSocketMax + 1, &fdsetRecv, &fdsetSend, &fdsetError, &timeout); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
628 vnThreadsRunning[0]++; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
629 if (fShutdown) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
630 return; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
631 if (nSelect == SOCKET_ERROR) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
632 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
633 int nErr = WSAGetLastError(); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
634 printf("socket select error %d\n", nErr); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
635 for (int i = 0; i <= hSocketMax; i++) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
636 FD_SET(i, &fdsetRecv); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
637 FD_ZERO(&fdsetSend); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
638 FD_ZERO(&fdsetError); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
639 Sleep(timeout.tv_usec/1000); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
640 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
641 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
642 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
643 // |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
644 // Accept new connections |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
645 // |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
646 if (FD_ISSET(hListenSocket, &fdsetRecv)) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
647 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
648 struct sockaddr_in sockaddr; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
649 socklen_t len = sizeof(sockaddr); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
650 SOCKET hSocket = accept(hListenSocket, (struct sockaddr*)&sockaddr, &len); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
651 CAddress addr(sockaddr); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
652 if (hSocket == INVALID_SOCKET) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
653 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
654 if (WSAGetLastError() != WSAEWOULDBLOCK) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
655 printf("socket error accept failed: %d\n", WSAGetLastError()); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
656 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
657 else if (mapArgs.count("-maxconnections") && (int)vNodes.size() >= atoi(mapArgs["-maxconnections"]) - MAX_OUTBOUND_CONNECTIONS) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
658 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
659 closesocket(hSocket); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
660 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
661 else |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
662 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
663 printf("accepted connection %s\n", addr.ToStringLog().c_str()); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
664 CNode* pnode = new CNode(hSocket, addr, true); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
665 pnode->AddRef(); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
666 CRITICAL_BLOCK(cs_vNodes) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
667 vNodes.push_back(pnode); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
668 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
669 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
670 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
671 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
672 // |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
673 // Service each socket |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
674 // |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
675 vector<CNode*> vNodesCopy; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
676 CRITICAL_BLOCK(cs_vNodes) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
677 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
678 vNodesCopy = vNodes; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
679 foreach(CNode* pnode, vNodesCopy) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
680 pnode->AddRef(); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
681 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
682 foreach(CNode* pnode, vNodesCopy) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
683 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
684 if (fShutdown) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
685 return; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
686 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
687 // |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
688 // Receive |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
689 // |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
690 if (pnode->hSocket == INVALID_SOCKET) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
691 continue; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
692 if (FD_ISSET(pnode->hSocket, &fdsetRecv) || FD_ISSET(pnode->hSocket, &fdsetError)) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
693 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
694 TRY_CRITICAL_BLOCK(pnode->cs_vRecv) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
695 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
696 CDataStream& vRecv = pnode->vRecv; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
697 unsigned int nPos = vRecv.size(); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
698 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
699 // typical socket buffer is 8K-64K |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
700 char pchBuf[0x10000]; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
701 int nBytes = recv(pnode->hSocket, pchBuf, sizeof(pchBuf), MSG_DONTWAIT); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
702 if (nBytes > 0) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
703 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
704 vRecv.resize(nPos + nBytes); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
705 memcpy(&vRecv[nPos], pchBuf, nBytes); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
706 pnode->nLastRecv = GetTime(); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
707 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
708 else if (nBytes == 0) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
709 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
710 // socket closed gracefully |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
711 if (!pnode->fDisconnect) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
712 printf("socket closed\n"); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
713 pnode->CloseSocketDisconnect(); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
714 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
715 else if (nBytes < 0) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
716 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
717 // error |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
718 int nErr = WSAGetLastError(); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
719 if (nErr != WSAEWOULDBLOCK && nErr != WSAEMSGSIZE && nErr != WSAEINTR && nErr != WSAEINPROGRESS) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
720 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
721 if (!pnode->fDisconnect) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
722 printf("socket recv error %d\n", nErr); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
723 pnode->CloseSocketDisconnect(); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
724 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
725 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
726 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
727 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
728 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
729 // |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
730 // Send |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
731 // |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
732 if (pnode->hSocket == INVALID_SOCKET) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
733 continue; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
734 if (FD_ISSET(pnode->hSocket, &fdsetSend)) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
735 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
736 TRY_CRITICAL_BLOCK(pnode->cs_vSend) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
737 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
738 CDataStream& vSend = pnode->vSend; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
739 if (!vSend.empty()) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
740 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
741 int nBytes = send(pnode->hSocket, &vSend[0], vSend.size(), MSG_NOSIGNAL | MSG_DONTWAIT); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
742 if (nBytes > 0) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
743 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
744 vSend.erase(vSend.begin(), vSend.begin() + nBytes); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
745 pnode->nLastSend = GetTime(); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
746 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
747 else if (nBytes < 0) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
748 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
749 // error |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
750 int nErr = WSAGetLastError(); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
751 if (nErr != WSAEWOULDBLOCK && nErr != WSAEMSGSIZE && nErr != WSAEINTR && nErr != WSAEINPROGRESS) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
752 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
753 printf("socket send error %d\n", nErr); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
754 pnode->CloseSocketDisconnect(); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
755 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
756 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
757 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
758 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
759 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
760 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
761 // |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
762 // Inactivity checking |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
763 // |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
764 if (pnode->vSend.empty()) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
765 pnode->nLastSendEmpty = GetTime(); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
766 if (GetTime() - pnode->nTimeConnected > 60) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
767 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
768 if (pnode->nLastRecv == 0 || pnode->nLastSend == 0) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
769 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
770 printf("socket no message in first 60 seconds, %d %d\n", pnode->nLastRecv != 0, pnode->nLastSend != 0); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
771 pnode->fDisconnect = true; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
772 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
773 else if (GetTime() - pnode->nLastSend > 90*60 && GetTime() - pnode->nLastSendEmpty > 90*60) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
774 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
775 printf("socket not sending\n"); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
776 pnode->fDisconnect = true; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
777 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
778 else if (GetTime() - pnode->nLastRecv > 90*60) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
779 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
780 printf("socket inactivity timeout\n"); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
781 pnode->fDisconnect = true; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
782 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
783 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
784 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
785 CRITICAL_BLOCK(cs_vNodes) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
786 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
787 foreach(CNode* pnode, vNodesCopy) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
788 pnode->Release(); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
789 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
790 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
791 Sleep(10); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
792 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
793 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
794 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
795 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
796 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
797 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
798 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
799 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
800 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
801 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
802 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
803 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
804 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
805 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
806 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
807 unsigned int pnSeed[] = |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
808 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
809 // 2010/06 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
810 0x35218252, 0x9c9c9618, 0xda6bacad, 0xb9aca862, 0x97c235c6, |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
811 0x146f9562, 0xb67b9e4b, 0x87cf4bc0, 0xb83945d0, 0x984333ad, |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
812 0xbbeec555, 0x6f0eb440, 0xe0005318, 0x7797e460, 0xddc60fcc, |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
813 0xb3bbd24a, 0x1ac85746, 0x641846a6, 0x85ee1155, 0xbb2e7a4c, |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
814 0x9cb8514b, 0xfc342648, 0x62958fae, 0xd0a8c87a, 0xa800795b, |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
815 0xda8c814e, 0x256a0c80, 0x3f23ec63, 0xd565df43, 0x997d9044, |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
816 0xaa121448, 0xbed8688e, 0x59d09a5e, 0xb2931243, 0x3730ba18, |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
817 0xdd3462d0, 0x4e4d1448, 0x171df645, 0x84ee1155, |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
818 0x248ac445, 0x0e634444, 0x0ded1b63, 0x30c01e60, |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
819 0xa2b9a094, 0x29e4fd43, 0x9ce61b4c, 0xdae09744, |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
820 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
821 // 2010/08 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
822 0x5ae6bf43, 0x460be257, 0x7245c0cf, 0x4e0f028d, 0x26501760, 0x38643255, 0x67094f4f, 0x480449b8, |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
823 0x16545143, 0x1f082e5a, 0xaa428018, 0xe411e793, 0x14c1f862, 0x2726105b, 0x9b33ea50, 0xeeef86ca, |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
824 0xe3210d44, 0x0dca8b63, 0x3f9dfb18, 0x860340ad, 0xf33ba17a, 0x9018375c, 0x1de4e353, 0x0fa52dcb, |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
825 0x89c4555b, 0x109cf37b, 0x28c55b40, 0x04c801ae, 0x275c1e80, 0x6f7f745d, 0x7a2a5653, 0xa28e26d8, |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
826 0xa4e65db2, 0x99a06580, 0xf253ba44, 0x82cf6ab8, 0x859c2e8e, 0xf71a815d, 0xc18f1454, 0x71c8a943, |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
827 0x90d24e18, 0x311789b2, 0x74aba645, 0xde0bbfc3, 0xad724fad, 0xbf1ae15e, 0xbaa6fb54, 0x06e4d145, |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
828 0x51528645, 0x72120cd4, 0xd4cfd145, 0x0a7afed8, 0x9b9a5fad, 0x9e9ff45e, 0x10128355, 0xd44e8646, |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
829 0x04a07b47, 0x5fc9d547, 0xe0491e45, 0xbac21b41, 0x7aa31bae, 0x10483c5f, 0x94a23055, 0x73d9dc47, |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
830 0x1a99c247, 0x822fe847, 0x7e57ba48, 0xb19ea843, 0xa60621b2, 0x778cf163, 0x125c6556, 0xf94ba44f, |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
831 0xa61a0948, 0x6c839e4b, 0x29af5348, 0x68d84845, 0x752b95c3, 0xcf0d4663, 0x08e11e56, 0x75109550, |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
832 0x5f24b94c, 0x42426d4d, 0xfbbc0a4c, 0x70a9a246, 0xda7837cb, 0xae2a986d, 0xe283c358, 0x0c7ca954, |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
833 0x8e9bde59, 0x61521760, 0x6884444c, 0xa194e548, 0x9b8809cc, 0x16e96a8f, 0x956ff859, 0xfad5e555, |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
834 0x0ea70c80, 0x5b4ce26d, 0x7984444c, 0x1080d24a, 0x22a686cf, 0x6bf8c2ad, 0xb0f7485f, 0x06b66e56, |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
835 0x668373bc, 0x75506279, 0x3868694e, 0x12a5954b, 0x3a8b62d1, 0xb74fcbad, 0xa7dc3360, 0xc070b359, |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
836 0xa2b87242, 0xc45cab7c, 0x69882050, 0x14a5464b, 0x386acad5, 0x80b85db2, 0x1f78a062, 0xc608c55b, |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
837 0x4257d543, 0x7636ad80, 0x4432d655, 0xb2114d4b, 0x32639bd9, 0xadd75db2, 0x9be5a362, 0x6831bc5e, |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
838 0xf7f77046, 0x8f35ba81, 0x09bb4e59, 0xd0fb6b4e, 0xc5daa445, 0x9c611618, 0x355dcc62, 0xf2cf435e, |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
839 0x31e72c46, 0xdd8a43ad, 0x171f9c5b, 0xb4c2e355, 0xbe8af945, 0x613d3942, 0xe6f9e863, 0x7a3d855f, |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
840 0xa66adc47, 0x261089b2, 0x5a27105b, 0x6c28105b, 0xdd247946, 0xe6c3a445, 0x43a1ec63, 0x99b4dd5f, |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
841 0xb6834347, 0x5e9649bc, 0xf9dd545d, 0x6ae4c15b, 0xa5318a47, 0x7984ec47, 0x93a73b63, 0x0c60195f, |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
842 0xa5c85e4b, 0xa0a36dc2, 0x0739a95e, 0x3d44c15b, 0xfb940f4b, 0xd67c9148, 0x614f9876, 0x0a241c5f, |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
843 0xad9da74c, 0x4459abc8, 0x12e71b5f, 0x1c534a5d, 0x8ff5fc50, 0x2ca8864b, 0xd894fd80, 0x82ab3160, |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
844 0x390d804e, 0x2cf310cc, 0x680dad80, 0x691be15e, 0x5a8f4652, 0xaad0784d, 0x0d2431ad, |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
845 }; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
846 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
847 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
848 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
849 void ThreadOpenConnections(void* parg) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
850 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
851 IMPLEMENT_RANDOMIZE_STACK(ThreadOpenConnections(parg)); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
852 try |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
853 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
854 vnThreadsRunning[1]++; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
855 ThreadOpenConnections2(parg); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
856 vnThreadsRunning[1]--; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
857 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
858 catch (std::exception& e) { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
859 vnThreadsRunning[1]--; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
860 PrintException(&e, "ThreadOpenConnections()"); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
861 } catch (...) { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
862 vnThreadsRunning[1]--; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
863 PrintException(NULL, "ThreadOpenConnections()"); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
864 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
865 printf("ThreadOpenConnections exiting\n"); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
866 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
867 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
868 void ThreadOpenConnections2(void* parg) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
869 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
870 printf("ThreadOpenConnections started\n"); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
871 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
872 // Connect to specific addresses |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
873 if (mapArgs.count("-connect")) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
874 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
875 for (int64 nLoop = 0;; nLoop++) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
876 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
877 foreach(string strAddr, mapMultiArgs["-connect"]) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
878 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
879 CAddress addr(strAddr, NODE_NETWORK); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
880 if (addr.IsValid()) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
881 OpenNetworkConnection(addr); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
882 for (int i = 0; i < 10 && i < nLoop; i++) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
883 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
884 Sleep(500); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
885 if (fShutdown) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
886 return; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
887 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
888 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
889 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
890 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
891 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
892 // Connect to manually added nodes first |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
893 if (mapArgs.count("-addnode")) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
894 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
895 foreach(string strAddr, mapMultiArgs["-addnode"]) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
896 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
897 CAddress addr(strAddr, NODE_NETWORK); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
898 if (addr.IsValid()) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
899 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
900 OpenNetworkConnection(addr); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
901 Sleep(500); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
902 if (fShutdown) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
903 return; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
904 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
905 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
906 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
907 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
908 // Initiate network connections |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
909 int64 nStart = GetTime(); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
910 loop |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
911 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
912 // Limit outbound connections |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
913 vnThreadsRunning[1]--; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
914 Sleep(500); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
915 loop |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
916 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
917 int nOutbound = 0; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
918 CRITICAL_BLOCK(cs_vNodes) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
919 foreach(CNode* pnode, vNodes) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
920 if (!pnode->fInbound) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
921 nOutbound++; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
922 int nMaxOutboundConnections = MAX_OUTBOUND_CONNECTIONS; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
923 if (mapArgs.count("-maxconnections")) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
924 nMaxOutboundConnections = min(nMaxOutboundConnections, atoi(mapArgs["-maxconnections"])); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
925 if (nOutbound < nMaxOutboundConnections) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
926 break; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
927 Sleep(2000); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
928 if (fShutdown) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
929 return; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
930 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
931 vnThreadsRunning[1]++; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
932 if (fShutdown) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
933 return; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
934 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
935 CRITICAL_BLOCK(cs_mapAddresses) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
936 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
937 // Add seed nodes if IRC isn't working |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
938 static bool fSeedUsed; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
939 bool fTOR = (fUseProxy && addrProxy.port == htons(9050)); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
940 if (mapAddresses.empty() && (GetTime() - nStart > 60 || fTOR)) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
941 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
942 for (int i = 0; i < ARRAYLEN(pnSeed); i++) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
943 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
944 // It'll only connect to one or two seed nodes because once it connects, |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
945 // it'll get a pile of addresses with newer timestamps. |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
946 CAddress addr; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
947 addr.ip = pnSeed[i]; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
948 addr.nTime = 0; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
949 AddAddress(addr); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
950 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
951 fSeedUsed = true; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
952 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
953 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
954 if (fSeedUsed && mapAddresses.size() > ARRAYLEN(pnSeed) + 100) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
955 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
956 // Disconnect seed nodes |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
957 set<unsigned int> setSeed(pnSeed, pnSeed + ARRAYLEN(pnSeed)); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
958 static int64 nSeedDisconnected; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
959 if (nSeedDisconnected == 0) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
960 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
961 nSeedDisconnected = GetTime(); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
962 CRITICAL_BLOCK(cs_vNodes) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
963 foreach(CNode* pnode, vNodes) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
964 if (setSeed.count(pnode->addr.ip)) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
965 pnode->fDisconnect = true; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
966 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
967 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
968 // Keep setting timestamps to 0 so they won't reconnect |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
969 if (GetTime() - nSeedDisconnected < 60 * 60) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
970 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
971 foreach(PAIRTYPE(const vector<unsigned char>, CAddress)& item, mapAddresses) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
972 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
973 if (setSeed.count(item.second.ip)) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
974 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
975 item.second.nTime = 0; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
976 CAddrDB().WriteAddress(item.second); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
977 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
978 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
979 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
980 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
981 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
982 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
983 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
984 // |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
985 // Choose an address to connect to based on most recently seen |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
986 // |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
987 CAddress addrConnect; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
988 int64 nBest = INT64_MIN; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
989 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
990 // Only connect to one address per a.b.?.? range. |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
991 // Do this here so we don't have to critsect vNodes inside mapAddresses critsect. |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
992 set<unsigned int> setConnected; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
993 CRITICAL_BLOCK(cs_vNodes) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
994 foreach(CNode* pnode, vNodes) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
995 setConnected.insert(pnode->addr.ip & 0x0000ffff); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
996 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
997 CRITICAL_BLOCK(cs_mapAddresses) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
998 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
999 foreach(const PAIRTYPE(vector<unsigned char>, CAddress)& item, mapAddresses) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1000 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1001 const CAddress& addr = item.second; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1002 if (!addr.IsIPv4() || !addr.IsValid() || setConnected.count(addr.ip & 0x0000ffff)) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1003 continue; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1004 int64 nSinceLastSeen = GetAdjustedTime() - addr.nTime; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1005 int64 nSinceLastTry = GetAdjustedTime() - addr.nLastTry; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1006 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1007 // Randomize the order in a deterministic way, putting the standard port first |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1008 int64 nRandomizer = (uint64)(nStart * 4951 + addr.nLastTry * 9567851 + addr.ip * 7789) % (2 * 60 * 60); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1009 if (addr.port != DEFAULT_PORT) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1010 nRandomizer += 2 * 60 * 60; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1011 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1012 // Last seen Base retry frequency |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1013 // <1 hour 10 min |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1014 // 1 hour 1 hour |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1015 // 4 hours 2 hours |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1016 // 24 hours 5 hours |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1017 // 48 hours 7 hours |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1018 // 7 days 13 hours |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1019 // 30 days 27 hours |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1020 // 90 days 46 hours |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1021 // 365 days 93 hours |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1022 int64 nDelay = (int64)(3600.0 * sqrt(fabs((double)nSinceLastSeen) / 3600.0) + nRandomizer); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1023 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1024 // Fast reconnect for one hour after last seen |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1025 if (nSinceLastSeen < 60 * 60) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1026 nDelay = 10 * 60; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1027 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1028 // Limit retry frequency |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1029 if (nSinceLastTry < nDelay) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1030 continue; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1031 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1032 // If we have IRC, we'll be notified when they first come online, |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1033 // and again every 24 hours by the refresh broadcast. |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1034 if (nGotIRCAddresses > 0 && vNodes.size() >= 2 && nSinceLastSeen > 24 * 60 * 60) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1035 continue; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1036 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1037 // Only try the old stuff if we don't have enough connections |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1038 if (vNodes.size() >= 8 && nSinceLastSeen > 24 * 60 * 60) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1039 continue; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1040 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1041 // If multiple addresses are ready, prioritize by time since |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1042 // last seen and time since last tried. |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1043 int64 nScore = min(nSinceLastTry, (int64)24 * 60 * 60) - nSinceLastSeen - nRandomizer; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1044 if (nScore > nBest) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1045 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1046 nBest = nScore; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1047 addrConnect = addr; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1048 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1049 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1050 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1051 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1052 if (addrConnect.IsValid()) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1053 OpenNetworkConnection(addrConnect); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1054 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1055 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1056 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1057 bool OpenNetworkConnection(const CAddress& addrConnect) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1058 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1059 // |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1060 // Initiate outbound network connection |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1061 // |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1062 if (fShutdown) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1063 return false; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1064 if (addrConnect.ip == addrLocalHost.ip || !addrConnect.IsIPv4() || FindNode(addrConnect.ip)) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1065 return false; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1066 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1067 vnThreadsRunning[1]--; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1068 CNode* pnode = ConnectNode(addrConnect); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1069 vnThreadsRunning[1]++; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1070 if (fShutdown) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1071 return false; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1072 if (!pnode) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1073 return false; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1074 pnode->fNetworkNode = true; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1075 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1076 if (addrLocalHost.IsRoutable() && !fUseProxy) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1077 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1078 // Advertise our address |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1079 vector<CAddress> vAddr; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1080 vAddr.push_back(addrLocalHost); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1081 pnode->PushMessage("addr", vAddr); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1082 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1083 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1084 // Get as many addresses as we can |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1085 pnode->PushMessage("getaddr"); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1086 pnode->fGetAddr = true; // don't relay the results of the getaddr |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1087 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1088 ////// should the one on the receiving end do this too? |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1089 // Subscribe our local subscription list |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1090 const unsigned int nHops = 0; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1091 for (unsigned int nChannel = 0; nChannel < pnodeLocalHost->vfSubscribe.size(); nChannel++) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1092 if (pnodeLocalHost->vfSubscribe[nChannel]) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1093 pnode->PushMessage("subscribe", nChannel, nHops); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1094 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1095 return true; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1096 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1097 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1098 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1099 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1100 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1101 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1102 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1103 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1104 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1105 void ThreadMessageHandler(void* parg) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1106 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1107 IMPLEMENT_RANDOMIZE_STACK(ThreadMessageHandler(parg)); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1108 try |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1109 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1110 vnThreadsRunning[2]++; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1111 ThreadMessageHandler2(parg); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1112 vnThreadsRunning[2]--; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1113 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1114 catch (std::exception& e) { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1115 vnThreadsRunning[2]--; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1116 PrintException(&e, "ThreadMessageHandler()"); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1117 } catch (...) { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1118 vnThreadsRunning[2]--; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1119 PrintException(NULL, "ThreadMessageHandler()"); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1120 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1121 printf("ThreadMessageHandler exiting\n"); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1122 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1123 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1124 void ThreadMessageHandler2(void* parg) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1125 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1126 printf("ThreadMessageHandler started\n"); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1127 SetThreadPriority(THREAD_PRIORITY_BELOW_NORMAL); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1128 while (!fShutdown) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1129 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1130 vector<CNode*> vNodesCopy; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1131 CRITICAL_BLOCK(cs_vNodes) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1132 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1133 vNodesCopy = vNodes; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1134 foreach(CNode* pnode, vNodesCopy) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1135 pnode->AddRef(); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1136 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1137 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1138 // Poll the connected nodes for messages |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1139 CNode* pnodeTrickle = NULL; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1140 if (!vNodesCopy.empty()) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1141 pnodeTrickle = vNodesCopy[GetRand(vNodesCopy.size())]; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1142 foreach(CNode* pnode, vNodesCopy) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1143 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1144 // Receive messages |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1145 TRY_CRITICAL_BLOCK(pnode->cs_vRecv) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1146 ProcessMessages(pnode); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1147 if (fShutdown) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1148 return; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1149 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1150 // Send messages |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1151 TRY_CRITICAL_BLOCK(pnode->cs_vSend) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1152 SendMessages(pnode, pnode == pnodeTrickle); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1153 if (fShutdown) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1154 return; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1155 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1156 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1157 CRITICAL_BLOCK(cs_vNodes) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1158 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1159 foreach(CNode* pnode, vNodesCopy) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1160 pnode->Release(); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1161 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1162 |
269
ae8c8d8f84bf
try to auto-detect whether to use 128-bit 4-way SSE2
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
268
diff
changeset
|
1163 // Wait and allow messages to bunch up. |
ae8c8d8f84bf
try to auto-detect whether to use 128-bit 4-way SSE2
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
268
diff
changeset
|
1164 // Reduce vnThreadsRunning so StopNode has permission to exit while |
ae8c8d8f84bf
try to auto-detect whether to use 128-bit 4-way SSE2
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
268
diff
changeset
|
1165 // we're sleeping, but we must always check fShutdown after doing this. |
264
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1166 vnThreadsRunning[2]--; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1167 Sleep(100); |
268
f7d27372246c
Gavin Andresen: clean shutdown on SIGTERM
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
267
diff
changeset
|
1168 if (fRequestShutdown) |
f7d27372246c
Gavin Andresen: clean shutdown on SIGTERM
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
267
diff
changeset
|
1169 Shutdown(NULL); |
264
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1170 vnThreadsRunning[2]++; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1171 if (fShutdown) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1172 return; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1173 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1174 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1175 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1176 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1177 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1178 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1179 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1180 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1181 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1182 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1183 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1184 bool BindListenPort(string& strError) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1185 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1186 strError = ""; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1187 int nOne = 1; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1188 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1189 #ifdef __WXMSW__ |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1190 // Initialize Windows Sockets |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1191 WSADATA wsadata; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1192 int ret = WSAStartup(MAKEWORD(2,2), &wsadata); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1193 if (ret != NO_ERROR) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1194 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1195 strError = strprintf("Error: TCP/IP socket library failed to start (WSAStartup returned error %d)", ret); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1196 printf("%s\n", strError.c_str()); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1197 return false; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1198 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1199 #endif |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1200 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1201 // Create socket for listening for incoming connections |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1202 hListenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1203 if (hListenSocket == INVALID_SOCKET) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1204 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1205 strError = strprintf("Error: Couldn't open socket for incoming connections (socket returned error %d)", WSAGetLastError()); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1206 printf("%s\n", strError.c_str()); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1207 return false; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1208 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1209 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1210 #ifdef BSD |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1211 // Different way of disabling SIGPIPE on BSD |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1212 setsockopt(hListenSocket, SOL_SOCKET, SO_NOSIGPIPE, (void*)&nOne, sizeof(int)); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1213 #endif |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1214 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1215 #ifndef __WXMSW__ |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1216 // Allow binding if the port is still in TIME_WAIT state after |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1217 // the program was closed and restarted. Not an issue on windows. |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1218 setsockopt(hListenSocket, SOL_SOCKET, SO_REUSEADDR, (void*)&nOne, sizeof(int)); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1219 #endif |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1220 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1221 #ifdef __WXMSW__ |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1222 // Set to nonblocking, incoming connections will also inherit this |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1223 if (ioctlsocket(hListenSocket, FIONBIO, (u_long*)&nOne) == SOCKET_ERROR) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1224 #else |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1225 if (fcntl(hListenSocket, F_SETFL, O_NONBLOCK) == SOCKET_ERROR) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1226 #endif |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1227 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1228 strError = strprintf("Error: Couldn't set properties on socket for incoming connections (error %d)", WSAGetLastError()); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1229 printf("%s\n", strError.c_str()); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1230 return false; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1231 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1232 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1233 // The sockaddr_in structure specifies the address family, |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1234 // IP address, and port for the socket that is being bound |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1235 struct sockaddr_in sockaddr; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1236 memset(&sockaddr, 0, sizeof(sockaddr)); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1237 sockaddr.sin_family = AF_INET; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1238 sockaddr.sin_addr.s_addr = INADDR_ANY; // bind to all IPs on this computer |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1239 sockaddr.sin_port = DEFAULT_PORT; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1240 if (::bind(hListenSocket, (struct sockaddr*)&sockaddr, sizeof(sockaddr)) == SOCKET_ERROR) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1241 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1242 int nErr = WSAGetLastError(); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1243 if (nErr == WSAEADDRINUSE) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1244 strError = strprintf("Unable to bind to port %d on this computer. Bitcoin is probably already running.", ntohs(sockaddr.sin_port)); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1245 else |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1246 strError = strprintf("Error: Unable to bind to port %d on this computer (bind returned error %d)", ntohs(sockaddr.sin_port), nErr); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1247 printf("%s\n", strError.c_str()); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1248 return false; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1249 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1250 printf("Bound to port %d\n", ntohs(sockaddr.sin_port)); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1251 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1252 // Listen for incoming connections |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1253 if (listen(hListenSocket, SOMAXCONN) == SOCKET_ERROR) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1254 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1255 strError = strprintf("Error: Listening for incoming connections failed (listen returned error %d)", WSAGetLastError()); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1256 printf("%s\n", strError.c_str()); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1257 return false; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1258 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1259 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1260 return true; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1261 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1262 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1263 void StartNode(void* parg) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1264 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1265 if (pnodeLocalHost == NULL) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1266 pnodeLocalHost = new CNode(INVALID_SOCKET, CAddress("127.0.0.1", nLocalServices)); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1267 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1268 #ifdef __WXMSW__ |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1269 // Get local host ip |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1270 char pszHostName[1000] = ""; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1271 if (gethostname(pszHostName, sizeof(pszHostName)) != SOCKET_ERROR) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1272 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1273 struct hostent* phostent = gethostbyname(pszHostName); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1274 if (phostent) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1275 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1276 // Take the first IP that isn't loopback 127.x.x.x |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1277 for (int i = 0; phostent->h_addr_list[i] != NULL; i++) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1278 printf("host ip %d: %s\n", i, CAddress(*(unsigned int*)phostent->h_addr_list[i]).ToStringIP().c_str()); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1279 for (int i = 0; phostent->h_addr_list[i] != NULL; i++) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1280 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1281 CAddress addr(*(unsigned int*)phostent->h_addr_list[i], DEFAULT_PORT, nLocalServices); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1282 if (addr.IsValid() && addr.GetByte(3) != 127) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1283 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1284 addrLocalHost = addr; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1285 break; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1286 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1287 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1288 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1289 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1290 #else |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1291 // Get local host ip |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1292 struct ifaddrs* myaddrs; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1293 if (getifaddrs(&myaddrs) == 0) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1294 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1295 for (struct ifaddrs* ifa = myaddrs; ifa != NULL; ifa = ifa->ifa_next) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1296 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1297 if (ifa->ifa_addr == NULL) continue; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1298 if ((ifa->ifa_flags & IFF_UP) == 0) continue; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1299 if (strcmp(ifa->ifa_name, "lo") == 0) continue; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1300 if (strcmp(ifa->ifa_name, "lo0") == 0) continue; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1301 char pszIP[100]; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1302 if (ifa->ifa_addr->sa_family == AF_INET) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1303 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1304 struct sockaddr_in* s4 = (struct sockaddr_in*)(ifa->ifa_addr); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1305 if (inet_ntop(ifa->ifa_addr->sa_family, (void*)&(s4->sin_addr), pszIP, sizeof(pszIP)) != NULL) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1306 printf("ipv4 %s: %s\n", ifa->ifa_name, pszIP); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1307 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1308 // Take the first IP that isn't loopback 127.x.x.x |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1309 CAddress addr(*(unsigned int*)&s4->sin_addr, DEFAULT_PORT, nLocalServices); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1310 if (addr.IsValid() && addr.GetByte(3) != 127) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1311 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1312 addrLocalHost = addr; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1313 break; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1314 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1315 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1316 else if (ifa->ifa_addr->sa_family == AF_INET6) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1317 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1318 struct sockaddr_in6* s6 = (struct sockaddr_in6*)(ifa->ifa_addr); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1319 if (inet_ntop(ifa->ifa_addr->sa_family, (void*)&(s6->sin6_addr), pszIP, sizeof(pszIP)) != NULL) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1320 printf("ipv6 %s: %s\n", ifa->ifa_name, pszIP); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1321 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1322 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1323 freeifaddrs(myaddrs); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1324 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1325 #endif |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1326 printf("addrLocalHost = %s\n", addrLocalHost.ToString().c_str()); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1327 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1328 // Get our external IP address for incoming connections |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1329 if (fUseProxy) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1330 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1331 // Proxies can't take incoming connections |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1332 addrLocalHost.ip = CAddress("0.0.0.0").ip; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1333 printf("addrLocalHost = %s\n", addrLocalHost.ToString().c_str()); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1334 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1335 else |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1336 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1337 if (addrIncoming.IsValid()) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1338 addrLocalHost.ip = addrIncoming.ip; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1339 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1340 if (GetMyExternalIP(addrLocalHost.ip)) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1341 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1342 addrIncoming = addrLocalHost; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1343 CWalletDB().WriteSetting("addrIncoming", addrIncoming); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1344 printf("addrLocalHost = %s\n", addrLocalHost.ToString().c_str()); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1345 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1346 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1347 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1348 // |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1349 // Start threads |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1350 // |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1351 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1352 // Get addresses from IRC and advertise ours |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1353 if (!CreateThread(ThreadIRCSeed, NULL)) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1354 printf("Error: CreateThread(ThreadIRCSeed) failed\n"); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1355 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1356 // Send and receive from sockets, accept connections |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1357 pthread_t hThreadSocketHandler = CreateThread(ThreadSocketHandler, NULL, true); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1358 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1359 // Initiate outbound connections |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1360 if (!CreateThread(ThreadOpenConnections, NULL)) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1361 printf("Error: CreateThread(ThreadOpenConnections) failed\n"); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1362 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1363 // Process messages |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1364 if (!CreateThread(ThreadMessageHandler, NULL)) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1365 printf("Error: CreateThread(ThreadMessageHandler) failed\n"); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1366 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1367 // Generate coins in the background |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1368 GenerateBitcoins(fGenerateBitcoins); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1369 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1370 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1371 bool StopNode() |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1372 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1373 printf("StopNode()\n"); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1374 fShutdown = true; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1375 nTransactionsUpdated++; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1376 int64 nStart = GetTime(); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1377 while (vnThreadsRunning[0] > 0 || vnThreadsRunning[2] > 0 || vnThreadsRunning[3] > 0 || vnThreadsRunning[4] > 0) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1378 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1379 if (GetTime() - nStart > 20) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1380 break; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1381 Sleep(20); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1382 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1383 if (vnThreadsRunning[0] > 0) printf("ThreadSocketHandler still running\n"); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1384 if (vnThreadsRunning[1] > 0) printf("ThreadOpenConnections still running\n"); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1385 if (vnThreadsRunning[2] > 0) printf("ThreadMessageHandler still running\n"); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1386 if (vnThreadsRunning[3] > 0) printf("ThreadBitcoinMiner still running\n"); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1387 if (vnThreadsRunning[4] > 0) printf("ThreadRPCServer still running\n"); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1388 while (vnThreadsRunning[2] > 0 || vnThreadsRunning[4] > 0) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1389 Sleep(20); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1390 Sleep(50); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1391 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1392 return true; |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1393 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1394 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1395 class CNetCleanup |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1396 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1397 public: |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1398 CNetCleanup() |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1399 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1400 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1401 ~CNetCleanup() |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1402 { |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1403 // Close sockets |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1404 foreach(CNode* pnode, vNodes) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1405 if (pnode->hSocket != INVALID_SOCKET) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1406 closesocket(pnode->hSocket); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1407 if (hListenSocket != INVALID_SOCKET) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1408 if (closesocket(hListenSocket) == SOCKET_ERROR) |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1409 printf("closesocket(hListenSocket) failed with error %d\n", WSAGetLastError()); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1410 |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1411 #ifdef __WXMSW__ |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1412 // Shutdown Windows Sockets |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1413 WSACleanup(); |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1414 #endif |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1415 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1416 } |
bbd929786bd5
propset svn:eol-style native
s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
parents:
225
diff
changeset
|
1417 instance_of_cnetcleanup; |