annotate src/netbase.cpp @ 2476:a9b012461972 draft

IPv6 node support This will make bitcoin relay valid routable IPv6 addresses, and when USE_IPV6 is enabled, listen on IPv6 interfaces and attempt connections to IPv6 addresses.
author Pieter Wuille <pieter.wuille@gmail.com>
date Sat, 31 Mar 2012 17:58:25 +0200
parents 1f0e9f9f3e51
children f8e75c9db98a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1731
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1 // Copyright (c) 2009-2010 Satoshi Nakamoto
1818
20667468f95b Update all copyrights to 2012
Gavin Andresen <gavinandresen@gmail.com>
parents: 1762
diff changeset
2 // Copyright (c) 2009-2012 The Bitcoin developers
1731
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
3 // Distributed under the MIT/X11 software license, see the accompanying
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
4 // file license.txt or http://www.opensource.org/licenses/mit-license.php.
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
5
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
6 #include "netbase.h"
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
7 #include "util.h"
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
8
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
9 #ifndef WIN32
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
10 #include <sys/fcntl.h>
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
11 #endif
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
12
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
13 #include "strlcpy.h"
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
14
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
15 using namespace std;
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
16
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
17 // Settings
2363
978eaea61f78 Support connecting by hostnames passed to proxy (-proxydns)
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2362
diff changeset
18 int nSocksVersion = 5;
1731
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
19 int fUseProxy = false;
2363
978eaea61f78 Support connecting by hostnames passed to proxy (-proxydns)
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2362
diff changeset
20 bool fProxyNameLookup = false;
978eaea61f78 Support connecting by hostnames passed to proxy (-proxydns)
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2362
diff changeset
21 bool fNameLookup = false;
1731
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
22 CService addrProxy("127.0.0.1",9050);
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
23 int nConnectTimeout = 5000;
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
24
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
25
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
26 static const unsigned char pchIPv4[12] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xff, 0xff };
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
27
2257
d2314c70384e Fix sign-compare warnings: netbase's Lookup* max-solutions may be unsigned
Jeff Garzik <jeff@garzik.org>
parents: 2256
diff changeset
28 bool static LookupIntern(const char *pszName, std::vector<CNetAddr>& vIP, unsigned int nMaxSolutions, bool fAllowLookup)
1731
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
29 {
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
30 vIP.clear();
1749
a16663dadac9 Compile with extra warnings turned on. And more makefile/code tidying up.
Gavin Andresen <gavinandresen@gmail.com>
parents: 1731
diff changeset
31 struct addrinfo aiHint;
a16663dadac9 Compile with extra warnings turned on. And more makefile/code tidying up.
Gavin Andresen <gavinandresen@gmail.com>
parents: 1731
diff changeset
32 memset(&aiHint, 0, sizeof(struct addrinfo));
a16663dadac9 Compile with extra warnings turned on. And more makefile/code tidying up.
Gavin Andresen <gavinandresen@gmail.com>
parents: 1731
diff changeset
33
1731
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
34 aiHint.ai_socktype = SOCK_STREAM;
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
35 aiHint.ai_protocol = IPPROTO_TCP;
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
36 #ifdef WIN32
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
37 # ifdef USE_IPV6
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
38 aiHint.ai_family = AF_UNSPEC;
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
39 aiHint.ai_flags = fAllowLookup ? 0 : AI_NUMERICHOST;
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
40 # else
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
41 aiHint.ai_family = AF_INET;
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
42 aiHint.ai_flags = fAllowLookup ? 0 : AI_NUMERICHOST;
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
43 # endif
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
44 #else
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
45 # ifdef USE_IPV6
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
46 aiHint.ai_family = AF_UNSPEC;
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
47 aiHint.ai_flags = AI_ADDRCONFIG | (fAllowLookup ? 0 : AI_NUMERICHOST);
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
48 # else
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
49 aiHint.ai_family = AF_INET;
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
50 aiHint.ai_flags = AI_ADDRCONFIG | (fAllowLookup ? 0 : AI_NUMERICHOST);
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
51 # endif
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
52 #endif
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
53 struct addrinfo *aiRes = NULL;
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
54 int nErr = getaddrinfo(pszName, NULL, &aiHint, &aiRes);
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
55 if (nErr)
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
56 return false;
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
57
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
58 struct addrinfo *aiTrav = aiRes;
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
59 while (aiTrav != NULL && (nMaxSolutions == 0 || vIP.size() < nMaxSolutions))
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
60 {
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
61 if (aiTrav->ai_family == AF_INET)
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
62 {
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
63 assert(aiTrav->ai_addrlen >= sizeof(sockaddr_in));
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
64 vIP.push_back(CNetAddr(((struct sockaddr_in*)(aiTrav->ai_addr))->sin_addr));
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
65 }
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
66
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
67 #ifdef USE_IPV6
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
68 if (aiTrav->ai_family == AF_INET6)
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
69 {
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
70 assert(aiTrav->ai_addrlen >= sizeof(sockaddr_in6));
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
71 vIP.push_back(CNetAddr(((struct sockaddr_in6*)(aiTrav->ai_addr))->sin6_addr));
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
72 }
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
73 #endif
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
74
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
75 aiTrav = aiTrav->ai_next;
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
76 }
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
77
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
78 freeaddrinfo(aiRes);
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
79
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
80 return (vIP.size() > 0);
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
81 }
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
82
2257
d2314c70384e Fix sign-compare warnings: netbase's Lookup* max-solutions may be unsigned
Jeff Garzik <jeff@garzik.org>
parents: 2256
diff changeset
83 bool LookupHost(const char *pszName, std::vector<CNetAddr>& vIP, unsigned int nMaxSolutions, bool fAllowLookup)
1731
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
84 {
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
85 if (pszName[0] == 0)
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
86 return false;
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
87 char psz[256];
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
88 char *pszHost = psz;
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
89 strlcpy(psz, pszName, sizeof(psz));
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
90 if (psz[0] == '[' && psz[strlen(psz)-1] == ']')
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
91 {
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
92 pszHost = psz+1;
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
93 psz[strlen(psz)-1] = 0;
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
94 }
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
95
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
96 return LookupIntern(pszHost, vIP, nMaxSolutions, fAllowLookup);
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
97 }
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
98
2257
d2314c70384e Fix sign-compare warnings: netbase's Lookup* max-solutions may be unsigned
Jeff Garzik <jeff@garzik.org>
parents: 2256
diff changeset
99 bool LookupHostNumeric(const char *pszName, std::vector<CNetAddr>& vIP, unsigned int nMaxSolutions)
1731
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
100 {
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
101 return LookupHost(pszName, vIP, nMaxSolutions, false);
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
102 }
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
103
2257
d2314c70384e Fix sign-compare warnings: netbase's Lookup* max-solutions may be unsigned
Jeff Garzik <jeff@garzik.org>
parents: 2256
diff changeset
104 bool Lookup(const char *pszName, std::vector<CService>& vAddr, int portDefault, bool fAllowLookup, unsigned int nMaxSolutions)
1731
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
105 {
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
106 if (pszName[0] == 0)
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
107 return false;
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
108 int port = portDefault;
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
109 char psz[256];
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
110 char *pszHost = psz;
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
111 strlcpy(psz, pszName, sizeof(psz));
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
112 char* pszColon = strrchr(psz+1,':');
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
113 char *pszPortEnd = NULL;
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
114 int portParsed = pszColon ? strtoul(pszColon+1, &pszPortEnd, 10) : 0;
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
115 if (pszColon && pszPortEnd && pszPortEnd[0] == 0)
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
116 {
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
117 if (psz[0] == '[' && pszColon[-1] == ']')
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
118 {
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
119 pszHost = psz+1;
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
120 pszColon[-1] = 0;
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
121 }
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
122 else
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
123 pszColon[0] = 0;
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
124 if (port >= 0 && port <= USHRT_MAX)
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
125 port = portParsed;
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
126 }
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
127 else
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
128 {
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
129 if (psz[0] == '[' && psz[strlen(psz)-1] == ']')
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
130 {
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
131 pszHost = psz+1;
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
132 psz[strlen(psz)-1] = 0;
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
133 }
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
134
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
135 }
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
136
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
137 std::vector<CNetAddr> vIP;
1747
77ce235c56b7 Add -keepnode which attempts to -addnode and keep a connection open
Matt Corallo <matt@bluematt.me>
parents: 1731
diff changeset
138 bool fRet = LookupIntern(pszHost, vIP, nMaxSolutions, fAllowLookup);
1731
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
139 if (!fRet)
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
140 return false;
1747
77ce235c56b7 Add -keepnode which attempts to -addnode and keep a connection open
Matt Corallo <matt@bluematt.me>
parents: 1731
diff changeset
141 vAddr.resize(vIP.size());
2256
341e07b996f2 Fix loop index var types, fixing many minor sign comparison warnings
Jeff Garzik <jeff@garzik.org>
parents: 1911
diff changeset
142 for (unsigned int i = 0; i < vIP.size(); i++)
1747
77ce235c56b7 Add -keepnode which attempts to -addnode and keep a connection open
Matt Corallo <matt@bluematt.me>
parents: 1731
diff changeset
143 vAddr[i] = CService(vIP[i], port);
77ce235c56b7 Add -keepnode which attempts to -addnode and keep a connection open
Matt Corallo <matt@bluematt.me>
parents: 1731
diff changeset
144 return true;
77ce235c56b7 Add -keepnode which attempts to -addnode and keep a connection open
Matt Corallo <matt@bluematt.me>
parents: 1731
diff changeset
145 }
77ce235c56b7 Add -keepnode which attempts to -addnode and keep a connection open
Matt Corallo <matt@bluematt.me>
parents: 1731
diff changeset
146
77ce235c56b7 Add -keepnode which attempts to -addnode and keep a connection open
Matt Corallo <matt@bluematt.me>
parents: 1731
diff changeset
147 bool Lookup(const char *pszName, CService& addr, int portDefault, bool fAllowLookup)
77ce235c56b7 Add -keepnode which attempts to -addnode and keep a connection open
Matt Corallo <matt@bluematt.me>
parents: 1731
diff changeset
148 {
77ce235c56b7 Add -keepnode which attempts to -addnode and keep a connection open
Matt Corallo <matt@bluematt.me>
parents: 1731
diff changeset
149 std::vector<CService> vService;
77ce235c56b7 Add -keepnode which attempts to -addnode and keep a connection open
Matt Corallo <matt@bluematt.me>
parents: 1731
diff changeset
150 bool fRet = Lookup(pszName, vService, portDefault, fAllowLookup, 1);
77ce235c56b7 Add -keepnode which attempts to -addnode and keep a connection open
Matt Corallo <matt@bluematt.me>
parents: 1731
diff changeset
151 if (!fRet)
77ce235c56b7 Add -keepnode which attempts to -addnode and keep a connection open
Matt Corallo <matt@bluematt.me>
parents: 1731
diff changeset
152 return false;
77ce235c56b7 Add -keepnode which attempts to -addnode and keep a connection open
Matt Corallo <matt@bluematt.me>
parents: 1731
diff changeset
153 addr = vService[0];
1731
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
154 return true;
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
155 }
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
156
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
157 bool LookupNumeric(const char *pszName, CService& addr, int portDefault)
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
158 {
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
159 return Lookup(pszName, addr, portDefault, false);
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
160 }
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
161
2360
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
162 bool static Socks4(const CService &addrDest, SOCKET& hSocket)
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
163 {
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
164 printf("SOCKS4 connecting %s\n", addrDest.ToString().c_str());
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
165 if (!addrDest.IsIPv4())
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
166 {
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
167 closesocket(hSocket);
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
168 return error("Proxy destination is not IPv4");
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
169 }
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
170 char pszSocks4IP[] = "\4\1\0\0\0\0\0\0user";
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
171 struct sockaddr_in addr;
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
172 addrDest.GetSockAddr(&addr);
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
173 memcpy(pszSocks4IP + 2, &addr.sin_port, 2);
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
174 memcpy(pszSocks4IP + 4, &addr.sin_addr, 4);
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
175 char* pszSocks4 = pszSocks4IP;
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
176 int nSize = sizeof(pszSocks4IP);
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
177
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
178 int ret = send(hSocket, pszSocks4, nSize, MSG_NOSIGNAL);
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
179 if (ret != nSize)
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
180 {
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
181 closesocket(hSocket);
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
182 return error("Error sending to proxy");
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
183 }
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
184 char pchRet[8];
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
185 if (recv(hSocket, pchRet, 8, 0) != 8)
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
186 {
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
187 closesocket(hSocket);
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
188 return error("Error reading proxy response");
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
189 }
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
190 if (pchRet[1] != 0x5a)
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
191 {
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
192 closesocket(hSocket);
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
193 if (pchRet[1] != 0x5b)
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
194 printf("ERROR: Proxy returned error %d\n", pchRet[1]);
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
195 return false;
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
196 }
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
197 printf("SOCKS4 connected %s\n", addrDest.ToString().c_str());
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
198 return true;
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
199 }
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
200
2362
f130873df296 refactor ConnectSocket
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2361
diff changeset
201 bool static Socks5(string strDest, int port, SOCKET& hSocket)
2360
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
202 {
2362
f130873df296 refactor ConnectSocket
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2361
diff changeset
203 printf("SOCKS5 connecting %s\n", strDest.c_str());
f130873df296 refactor ConnectSocket
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2361
diff changeset
204 if (strDest.size() > 255)
f130873df296 refactor ConnectSocket
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2361
diff changeset
205 {
f130873df296 refactor ConnectSocket
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2361
diff changeset
206 closesocket(hSocket);
f130873df296 refactor ConnectSocket
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2361
diff changeset
207 return error("Hostname too long");
f130873df296 refactor ConnectSocket
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2361
diff changeset
208 }
2360
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
209 char pszSocks5Init[] = "\5\1\0";
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
210 char *pszSocks5 = pszSocks5Init;
2422
1f0e9f9f3e51 Clean up warnings
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2417
diff changeset
211 ssize_t nSize = sizeof(pszSocks5Init);
2360
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
212
2422
1f0e9f9f3e51 Clean up warnings
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2417
diff changeset
213 ssize_t ret = send(hSocket, pszSocks5, nSize, MSG_NOSIGNAL);
2360
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
214 if (ret != nSize)
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
215 {
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
216 closesocket(hSocket);
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
217 return error("Error sending to proxy");
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
218 }
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
219 char pchRet1[2];
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
220 if (recv(hSocket, pchRet1, 2, 0) != 2)
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
221 {
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
222 closesocket(hSocket);
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
223 return error("Error reading proxy response");
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
224 }
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
225 if (pchRet1[0] != 0x05 || pchRet1[1] != 0x00)
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
226 {
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
227 closesocket(hSocket);
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
228 return error("Proxy failed to initialize");
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
229 }
2361
812ed27a255f SOCKS5 connect via hostname
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2360
diff changeset
230 string strSocks5("\5\1");
812ed27a255f SOCKS5 connect via hostname
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2360
diff changeset
231 strSocks5 += '\000'; strSocks5 += '\003';
812ed27a255f SOCKS5 connect via hostname
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2360
diff changeset
232 strSocks5 += static_cast<char>(std::min((int)strDest.size(), 255));
2362
f130873df296 refactor ConnectSocket
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2361
diff changeset
233 strSocks5 += strDest;
f130873df296 refactor ConnectSocket
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2361
diff changeset
234 strSocks5 += static_cast<char>((port >> 8) & 0xFF);
f130873df296 refactor ConnectSocket
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2361
diff changeset
235 strSocks5 += static_cast<char>((port >> 0) & 0xFF);
2361
812ed27a255f SOCKS5 connect via hostname
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2360
diff changeset
236 ret = send(hSocket, strSocks5.c_str(), strSocks5.size(), MSG_NOSIGNAL);
2422
1f0e9f9f3e51 Clean up warnings
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2417
diff changeset
237 if (ret != (ssize_t)strSocks5.size())
2360
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
238 {
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
239 closesocket(hSocket);
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
240 return error("Error sending to proxy");
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
241 }
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
242 char pchRet2[4];
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
243 if (recv(hSocket, pchRet2, 4, 0) != 4)
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
244 {
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
245 closesocket(hSocket);
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
246 return error("Error reading proxy response");
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
247 }
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
248 if (pchRet2[0] != 0x05)
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
249 {
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
250 closesocket(hSocket);
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
251 return error("Proxy failed to accept request");
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
252 }
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
253 if (pchRet2[1] != 0x00)
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
254 {
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
255 closesocket(hSocket);
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
256 switch (pchRet2[1])
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
257 {
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
258 case 0x01: return error("Proxy error: general failure");
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
259 case 0x02: return error("Proxy error: connection not allowed");
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
260 case 0x03: return error("Proxy error: network unreachable");
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
261 case 0x04: return error("Proxy error: host unreachable");
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
262 case 0x05: return error("Proxy error: connection refused");
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
263 case 0x06: return error("Proxy error: TTL expired");
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
264 case 0x07: return error("Proxy error: protocol error");
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
265 case 0x08: return error("Proxy error: address type not supported");
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
266 default: return error("Proxy error: unknown");
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
267 }
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
268 }
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
269 if (pchRet2[2] != 0x00)
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
270 {
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
271 closesocket(hSocket);
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
272 return error("Error: malformed proxy response");
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
273 }
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
274 char pchRet3[256];
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
275 switch (pchRet2[3])
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
276 {
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
277 case 0x01: ret = recv(hSocket, pchRet3, 4, 0) != 4; break;
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
278 case 0x04: ret = recv(hSocket, pchRet3, 16, 0) != 16; break;
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
279 case 0x03:
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
280 {
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
281 ret = recv(hSocket, pchRet3, 1, 0) != 1;
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
282 if (ret)
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
283 return error("Error reading from proxy");
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
284 int nRecv = pchRet3[0];
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
285 ret = recv(hSocket, pchRet3, nRecv, 0) != nRecv;
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
286 break;
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
287 }
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
288 default: closesocket(hSocket); return error("Error: malformed proxy response");
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
289 }
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
290 if (ret)
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
291 {
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
292 closesocket(hSocket);
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
293 return error("Error reading from proxy");
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
294 }
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
295 if (recv(hSocket, pchRet3, 2, 0) != 2)
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
296 {
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
297 closesocket(hSocket);
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
298 return error("Error reading from proxy");
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
299 }
2362
f130873df296 refactor ConnectSocket
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2361
diff changeset
300 printf("SOCKS5 connected %s\n", strDest.c_str());
2360
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
301 return true;
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
302 }
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
303
2362
f130873df296 refactor ConnectSocket
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2361
diff changeset
304 bool static ConnectSocketDirectly(const CService &addrConnect, SOCKET& hSocketRet, int nTimeout)
1731
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
305 {
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
306 hSocketRet = INVALID_SOCKET;
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
307
2476
a9b012461972 IPv6 node support
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2422
diff changeset
308 struct sockaddr_storage sockaddr;
a9b012461972 IPv6 node support
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2422
diff changeset
309 int nFamily = 0;
a9b012461972 IPv6 node support
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2422
diff changeset
310 size_t nSockAddrLen = 0;
a9b012461972 IPv6 node support
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2422
diff changeset
311
a9b012461972 IPv6 node support
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2422
diff changeset
312 if (addrConnect.IsIPv4())
a9b012461972 IPv6 node support
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2422
diff changeset
313 {
a9b012461972 IPv6 node support
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2422
diff changeset
314 // Use IPv4 stack to connect to IPv4 addresses
a9b012461972 IPv6 node support
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2422
diff changeset
315 struct sockaddr_in sockaddr4;
a9b012461972 IPv6 node support
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2422
diff changeset
316 if (!addrConnect.GetSockAddr(&sockaddr4))
a9b012461972 IPv6 node support
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2422
diff changeset
317 return false;
a9b012461972 IPv6 node support
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2422
diff changeset
318 memcpy(&sockaddr, &sockaddr4, sizeof(sockaddr4));
a9b012461972 IPv6 node support
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2422
diff changeset
319 nSockAddrLen = sizeof(sockaddr4);
a9b012461972 IPv6 node support
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2422
diff changeset
320 nFamily = AF_INET;
a9b012461972 IPv6 node support
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2422
diff changeset
321 }
a9b012461972 IPv6 node support
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2422
diff changeset
322 #ifdef USE_IPV6
a9b012461972 IPv6 node support
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2422
diff changeset
323 else if (addrConnect.IsIPv6())
a9b012461972 IPv6 node support
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2422
diff changeset
324 {
a9b012461972 IPv6 node support
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2422
diff changeset
325 struct sockaddr_in6 sockaddr6;
a9b012461972 IPv6 node support
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2422
diff changeset
326 if (!addrConnect.GetSockAddr6(&sockaddr6))
a9b012461972 IPv6 node support
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2422
diff changeset
327 return false;
a9b012461972 IPv6 node support
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2422
diff changeset
328 memcpy(&sockaddr, &sockaddr6, sizeof(sockaddr6));
a9b012461972 IPv6 node support
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2422
diff changeset
329 nSockAddrLen = sizeof(sockaddr6);
a9b012461972 IPv6 node support
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2422
diff changeset
330 nFamily = AF_INET6;
a9b012461972 IPv6 node support
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2422
diff changeset
331 }
a9b012461972 IPv6 node support
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2422
diff changeset
332 #endif
a9b012461972 IPv6 node support
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2422
diff changeset
333 else {
a9b012461972 IPv6 node support
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2422
diff changeset
334 printf("Cannot connect to %s: unsupported network\n", addrConnect.ToString().c_str());
a9b012461972 IPv6 node support
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2422
diff changeset
335 return false;
a9b012461972 IPv6 node support
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2422
diff changeset
336 }
a9b012461972 IPv6 node support
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2422
diff changeset
337
a9b012461972 IPv6 node support
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2422
diff changeset
338 SOCKET hSocket = socket(nFamily, SOCK_STREAM, IPPROTO_TCP);
1731
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
339 if (hSocket == INVALID_SOCKET)
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
340 return false;
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
341 #ifdef SO_NOSIGPIPE
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
342 int set = 1;
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
343 setsockopt(hSocket, SOL_SOCKET, SO_NOSIGPIPE, (void*)&set, sizeof(int));
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
344 #endif
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
345
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
346 #ifdef WIN32
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
347 u_long fNonblock = 1;
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
348 if (ioctlsocket(hSocket, FIONBIO, &fNonblock) == SOCKET_ERROR)
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
349 #else
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
350 int fFlags = fcntl(hSocket, F_GETFL, 0);
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
351 if (fcntl(hSocket, F_SETFL, fFlags | O_NONBLOCK) == -1)
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
352 #endif
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
353 {
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
354 closesocket(hSocket);
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
355 return false;
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
356 }
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
357
2476
a9b012461972 IPv6 node support
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2422
diff changeset
358 if (connect(hSocket, (struct sockaddr*)&sockaddr, nSockAddrLen) == SOCKET_ERROR)
1731
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
359 {
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
360 // WSAEINVAL is here because some legacy version of winsock uses it
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
361 if (WSAGetLastError() == WSAEINPROGRESS || WSAGetLastError() == WSAEWOULDBLOCK || WSAGetLastError() == WSAEINVAL)
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
362 {
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
363 struct timeval timeout;
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
364 timeout.tv_sec = nTimeout / 1000;
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
365 timeout.tv_usec = (nTimeout % 1000) * 1000;
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
366
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
367 fd_set fdset;
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
368 FD_ZERO(&fdset);
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
369 FD_SET(hSocket, &fdset);
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
370 int nRet = select(hSocket + 1, NULL, &fdset, NULL, &timeout);
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
371 if (nRet == 0)
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
372 {
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
373 printf("connection timeout\n");
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
374 closesocket(hSocket);
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
375 return false;
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
376 }
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
377 if (nRet == SOCKET_ERROR)
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
378 {
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
379 printf("select() for connection failed: %i\n",WSAGetLastError());
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
380 closesocket(hSocket);
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
381 return false;
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
382 }
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
383 socklen_t nRetSize = sizeof(nRet);
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
384 #ifdef WIN32
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
385 if (getsockopt(hSocket, SOL_SOCKET, SO_ERROR, (char*)(&nRet), &nRetSize) == SOCKET_ERROR)
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
386 #else
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
387 if (getsockopt(hSocket, SOL_SOCKET, SO_ERROR, &nRet, &nRetSize) == SOCKET_ERROR)
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
388 #endif
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
389 {
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
390 printf("getsockopt() for connection failed: %i\n",WSAGetLastError());
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
391 closesocket(hSocket);
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
392 return false;
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
393 }
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
394 if (nRet != 0)
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
395 {
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
396 printf("connect() failed after select(): %s\n",strerror(nRet));
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
397 closesocket(hSocket);
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
398 return false;
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
399 }
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
400 }
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
401 #ifdef WIN32
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
402 else if (WSAGetLastError() != WSAEISCONN)
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
403 #else
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
404 else
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
405 #endif
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
406 {
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
407 printf("connect() failed: %i\n",WSAGetLastError());
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
408 closesocket(hSocket);
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
409 return false;
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
410 }
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
411 }
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
412
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
413 // this isn't even strictly necessary
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
414 // CNode::ConnectNode immediately turns the socket back to non-blocking
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
415 // but we'll turn it back to blocking just in case
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
416 #ifdef WIN32
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
417 fNonblock = 0;
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
418 if (ioctlsocket(hSocket, FIONBIO, &fNonblock) == SOCKET_ERROR)
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
419 #else
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
420 fFlags = fcntl(hSocket, F_GETFL, 0);
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
421 if (fcntl(hSocket, F_SETFL, fFlags & !O_NONBLOCK) == SOCKET_ERROR)
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
422 #endif
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
423 {
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
424 closesocket(hSocket);
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
425 return false;
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
426 }
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
427
2362
f130873df296 refactor ConnectSocket
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2361
diff changeset
428 hSocketRet = hSocket;
f130873df296 refactor ConnectSocket
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2361
diff changeset
429 return true;
f130873df296 refactor ConnectSocket
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2361
diff changeset
430 }
f130873df296 refactor ConnectSocket
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2361
diff changeset
431
f130873df296 refactor ConnectSocket
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2361
diff changeset
432 bool ConnectSocket(const CService &addrDest, SOCKET& hSocketRet, int nTimeout)
f130873df296 refactor ConnectSocket
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2361
diff changeset
433 {
f130873df296 refactor ConnectSocket
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2361
diff changeset
434 SOCKET hSocket = INVALID_SOCKET;
f130873df296 refactor ConnectSocket
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2361
diff changeset
435 bool fProxy = (fUseProxy && addrDest.IsRoutable());
f130873df296 refactor ConnectSocket
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2361
diff changeset
436
f130873df296 refactor ConnectSocket
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2361
diff changeset
437 if (!ConnectSocketDirectly(fProxy ? addrProxy : addrDest, hSocket, nTimeout))
f130873df296 refactor ConnectSocket
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2361
diff changeset
438 return false;
f130873df296 refactor ConnectSocket
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2361
diff changeset
439
1731
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
440 if (fProxy)
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
441 {
2363
978eaea61f78 Support connecting by hostnames passed to proxy (-proxydns)
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2362
diff changeset
442 switch(nSocksVersion)
1731
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
443 {
2360
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
444 case 4:
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
445 if (!Socks4(addrDest, hSocket))
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
446 return false;
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
447 break;
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
448
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
449 case 5:
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
450 default:
2362
f130873df296 refactor ConnectSocket
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2361
diff changeset
451 if (!Socks5(addrDest.ToStringIP(), addrDest.GetPort(), hSocket))
2360
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
452 return false;
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
453 break;
5c7c8fa1d568 SOCKS5 support by default
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2257
diff changeset
454 }
1731
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
455 }
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
456
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
457 hSocketRet = hSocket;
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
458 return true;
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
459 }
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
460
2363
978eaea61f78 Support connecting by hostnames passed to proxy (-proxydns)
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2362
diff changeset
461 bool ConnectSocketByName(CService &addr, SOCKET& hSocketRet, const char *pszDest, int portDefault, int nTimeout)
978eaea61f78 Support connecting by hostnames passed to proxy (-proxydns)
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2362
diff changeset
462 {
978eaea61f78 Support connecting by hostnames passed to proxy (-proxydns)
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2362
diff changeset
463 string strDest(pszDest);
978eaea61f78 Support connecting by hostnames passed to proxy (-proxydns)
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2362
diff changeset
464 int port = portDefault;
978eaea61f78 Support connecting by hostnames passed to proxy (-proxydns)
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2362
diff changeset
465
978eaea61f78 Support connecting by hostnames passed to proxy (-proxydns)
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2362
diff changeset
466 size_t colon = strDest.find_last_of(':');
978eaea61f78 Support connecting by hostnames passed to proxy (-proxydns)
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2362
diff changeset
467 char *endp = NULL;
978eaea61f78 Support connecting by hostnames passed to proxy (-proxydns)
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2362
diff changeset
468 int n = strtol(pszDest + colon + 1, &endp, 10);
978eaea61f78 Support connecting by hostnames passed to proxy (-proxydns)
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2362
diff changeset
469 if (endp && *endp == 0 && n >= 0) {
978eaea61f78 Support connecting by hostnames passed to proxy (-proxydns)
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2362
diff changeset
470 strDest = strDest.substr(0, colon);
978eaea61f78 Support connecting by hostnames passed to proxy (-proxydns)
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2362
diff changeset
471 if (n > 0 && n < 0x10000)
978eaea61f78 Support connecting by hostnames passed to proxy (-proxydns)
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2362
diff changeset
472 port = n;
978eaea61f78 Support connecting by hostnames passed to proxy (-proxydns)
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2362
diff changeset
473 }
978eaea61f78 Support connecting by hostnames passed to proxy (-proxydns)
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2362
diff changeset
474 if (strDest[0] == '[' && strDest[strDest.size()-1] == ']')
978eaea61f78 Support connecting by hostnames passed to proxy (-proxydns)
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2362
diff changeset
475 strDest = strDest.substr(1, strDest.size()-2);
978eaea61f78 Support connecting by hostnames passed to proxy (-proxydns)
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2362
diff changeset
476
978eaea61f78 Support connecting by hostnames passed to proxy (-proxydns)
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2362
diff changeset
477 SOCKET hSocket = INVALID_SOCKET;
978eaea61f78 Support connecting by hostnames passed to proxy (-proxydns)
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2362
diff changeset
478 CService addrResolved(CNetAddr(strDest, fNameLookup && !fProxyNameLookup), port);
978eaea61f78 Support connecting by hostnames passed to proxy (-proxydns)
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2362
diff changeset
479 if (addrResolved.IsValid()) {
978eaea61f78 Support connecting by hostnames passed to proxy (-proxydns)
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2362
diff changeset
480 addr = addrResolved;
978eaea61f78 Support connecting by hostnames passed to proxy (-proxydns)
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2362
diff changeset
481 return ConnectSocket(addr, hSocketRet, nTimeout);
978eaea61f78 Support connecting by hostnames passed to proxy (-proxydns)
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2362
diff changeset
482 }
978eaea61f78 Support connecting by hostnames passed to proxy (-proxydns)
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2362
diff changeset
483 addr = CService("0.0.0.0:0");
978eaea61f78 Support connecting by hostnames passed to proxy (-proxydns)
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2362
diff changeset
484 if (!fNameLookup)
978eaea61f78 Support connecting by hostnames passed to proxy (-proxydns)
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2362
diff changeset
485 return false;
978eaea61f78 Support connecting by hostnames passed to proxy (-proxydns)
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2362
diff changeset
486 if (!ConnectSocketDirectly(addrProxy, hSocket, nTimeout))
978eaea61f78 Support connecting by hostnames passed to proxy (-proxydns)
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2362
diff changeset
487 return false;
978eaea61f78 Support connecting by hostnames passed to proxy (-proxydns)
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2362
diff changeset
488
978eaea61f78 Support connecting by hostnames passed to proxy (-proxydns)
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2362
diff changeset
489 switch(nSocksVersion)
978eaea61f78 Support connecting by hostnames passed to proxy (-proxydns)
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2362
diff changeset
490 {
978eaea61f78 Support connecting by hostnames passed to proxy (-proxydns)
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2362
diff changeset
491 case 4: return false;
978eaea61f78 Support connecting by hostnames passed to proxy (-proxydns)
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2362
diff changeset
492 case 5:
978eaea61f78 Support connecting by hostnames passed to proxy (-proxydns)
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2362
diff changeset
493 default:
978eaea61f78 Support connecting by hostnames passed to proxy (-proxydns)
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2362
diff changeset
494 if (!Socks5(strDest, port, hSocket))
978eaea61f78 Support connecting by hostnames passed to proxy (-proxydns)
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2362
diff changeset
495 return false;
978eaea61f78 Support connecting by hostnames passed to proxy (-proxydns)
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2362
diff changeset
496 break;
978eaea61f78 Support connecting by hostnames passed to proxy (-proxydns)
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2362
diff changeset
497 }
978eaea61f78 Support connecting by hostnames passed to proxy (-proxydns)
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2362
diff changeset
498
978eaea61f78 Support connecting by hostnames passed to proxy (-proxydns)
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2362
diff changeset
499 hSocketRet = hSocket;
978eaea61f78 Support connecting by hostnames passed to proxy (-proxydns)
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2362
diff changeset
500 return true;
978eaea61f78 Support connecting by hostnames passed to proxy (-proxydns)
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2362
diff changeset
501 }
978eaea61f78 Support connecting by hostnames passed to proxy (-proxydns)
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2362
diff changeset
502
1731
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
503 void CNetAddr::Init()
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
504 {
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
505 memset(ip, 0, 16);
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
506 }
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
507
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
508 void CNetAddr::SetIP(const CNetAddr& ipIn)
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
509 {
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
510 memcpy(ip, ipIn.ip, sizeof(ip));
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
511 }
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
512
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
513 CNetAddr::CNetAddr()
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
514 {
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
515 Init();
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
516 }
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
517
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
518 CNetAddr::CNetAddr(const struct in_addr& ipv4Addr)
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
519 {
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
520 memcpy(ip, pchIPv4, 12);
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
521 memcpy(ip+12, &ipv4Addr, 4);
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
522 }
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
523
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
524 #ifdef USE_IPV6
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
525 CNetAddr::CNetAddr(const struct in6_addr& ipv6Addr)
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
526 {
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
527 memcpy(ip, &ipv6Addr, 16);
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
528 }
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
529 #endif
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
530
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
531 CNetAddr::CNetAddr(const char *pszIp, bool fAllowLookup)
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
532 {
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
533 Init();
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
534 std::vector<CNetAddr> vIP;
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
535 if (LookupHost(pszIp, vIP, 1, fAllowLookup))
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
536 *this = vIP[0];
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
537 }
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
538
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
539 CNetAddr::CNetAddr(const std::string &strIp, bool fAllowLookup)
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
540 {
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
541 Init();
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
542 std::vector<CNetAddr> vIP;
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
543 if (LookupHost(strIp.c_str(), vIP, 1, fAllowLookup))
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
544 *this = vIP[0];
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
545 }
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
546
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
547 int CNetAddr::GetByte(int n) const
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
548 {
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
549 return ip[15-n];
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
550 }
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
551
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
552 bool CNetAddr::IsIPv4() const
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
553 {
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
554 return (memcmp(ip, pchIPv4, sizeof(pchIPv4)) == 0);
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
555 }
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
556
2476
a9b012461972 IPv6 node support
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2422
diff changeset
557 bool CNetAddr::IsIPv6() const
a9b012461972 IPv6 node support
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2422
diff changeset
558 {
a9b012461972 IPv6 node support
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2422
diff changeset
559 return (!IsIPv4());
a9b012461972 IPv6 node support
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2422
diff changeset
560 }
a9b012461972 IPv6 node support
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2422
diff changeset
561
1731
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
562 bool CNetAddr::IsRFC1918() const
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
563 {
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
564 return IsIPv4() && (
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
565 GetByte(3) == 10 ||
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
566 (GetByte(3) == 192 && GetByte(2) == 168) ||
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
567 (GetByte(3) == 172 && (GetByte(2) >= 16 && GetByte(2) <= 31)));
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
568 }
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
569
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
570 bool CNetAddr::IsRFC3927() const
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
571 {
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
572 return IsIPv4() && (GetByte(3) == 169 && GetByte(2) == 254);
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
573 }
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
574
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
575 bool CNetAddr::IsRFC3849() const
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
576 {
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
577 return GetByte(15) == 0x20 && GetByte(14) == 0x01 && GetByte(13) == 0x0D && GetByte(12) == 0xB8;
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
578 }
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
579
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
580 bool CNetAddr::IsRFC3964() const
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
581 {
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
582 return (GetByte(15) == 0x20 && GetByte(14) == 0x02);
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
583 }
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
584
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
585 bool CNetAddr::IsRFC6052() const
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
586 {
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
587 static const unsigned char pchRFC6052[] = {0,0x64,0xFF,0x9B,0,0,0,0,0,0,0,0};
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
588 return (memcmp(ip, pchRFC6052, sizeof(pchRFC6052)) == 0);
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
589 }
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
590
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
591 bool CNetAddr::IsRFC4380() const
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
592 {
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
593 return (GetByte(15) == 0x20 && GetByte(14) == 0x01 && GetByte(13) == 0 && GetByte(12) == 0);
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
594 }
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
595
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
596 bool CNetAddr::IsRFC4862() const
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
597 {
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
598 static const unsigned char pchRFC4862[] = {0xFE,0x80,0,0,0,0,0,0};
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
599 return (memcmp(ip, pchRFC4862, sizeof(pchRFC4862)) == 0);
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
600 }
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
601
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
602 bool CNetAddr::IsRFC4193() const
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
603 {
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
604 return ((GetByte(15) & 0xFE) == 0xFC);
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
605 }
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
606
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
607 bool CNetAddr::IsRFC6145() const
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
608 {
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
609 static const unsigned char pchRFC6145[] = {0,0,0,0,0,0,0,0,0xFF,0xFF,0,0};
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
610 return (memcmp(ip, pchRFC6145, sizeof(pchRFC6145)) == 0);
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
611 }
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
612
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
613 bool CNetAddr::IsRFC4843() const
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
614 {
1856
54a8b11aba45 fix typo in CNetAddr::IsRFC4843() (fixes #850)
Wladimir J. van der Laan <laanwj@gmail.com>
parents: 1818
diff changeset
615 return (GetByte(15) == 0x20 && GetByte(14) == 0x01 && GetByte(13) == 0x00 && (GetByte(12) & 0xF0) == 0x10);
1731
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
616 }
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
617
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
618 bool CNetAddr::IsLocal() const
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
619 {
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
620 // IPv4 loopback
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
621 if (IsIPv4() && (GetByte(3) == 127 || GetByte(3) == 0))
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
622 return true;
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
623
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
624 // IPv6 loopback (::1/128)
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
625 static const unsigned char pchLocal[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1};
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
626 if (memcmp(ip, pchLocal, 16) == 0)
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
627 return true;
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
628
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
629 return false;
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
630 }
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
631
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
632 bool CNetAddr::IsMulticast() const
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
633 {
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
634 return (IsIPv4() && (GetByte(3) & 0xF0) == 0xE0)
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
635 || (GetByte(15) == 0xFF);
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
636 }
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
637
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
638 bool CNetAddr::IsValid() const
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
639 {
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
640 // Clean up 3-byte shifted addresses caused by garbage in size field
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
641 // of addr messages from versions before 0.2.9 checksum.
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
642 // Two consecutive addr messages look like this:
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
643 // header20 vectorlen3 addr26 addr26 addr26 header20 vectorlen3 addr26 addr26 addr26...
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
644 // so if the first length field is garbled, it reads the second batch
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
645 // of addr misaligned by 3 bytes.
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
646 if (memcmp(ip, pchIPv4+3, sizeof(pchIPv4)-3) == 0)
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
647 return false;
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
648
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
649 // unspecified IPv6 address (::/128)
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
650 unsigned char ipNone[16] = {};
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
651 if (memcmp(ip, ipNone, 16) == 0)
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
652 return false;
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
653
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
654 // documentation IPv6 address
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
655 if (IsRFC3849())
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
656 return false;
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
657
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
658 if (IsIPv4())
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
659 {
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
660 // INADDR_NONE
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
661 uint32_t ipNone = INADDR_NONE;
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
662 if (memcmp(ip+12, &ipNone, 4) == 0)
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
663 return false;
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
664
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
665 // 0
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
666 ipNone = 0;
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
667 if (memcmp(ip+12, &ipNone, 4) == 0)
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
668 return false;
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
669 }
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
670
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
671 return true;
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
672 }
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
673
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
674 bool CNetAddr::IsRoutable() const
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
675 {
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
676 return IsValid() && !(IsRFC1918() || IsRFC3927() || IsRFC4862() || IsRFC4193() || IsRFC4843() || IsLocal());
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
677 }
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
678
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
679 std::string CNetAddr::ToStringIP() const
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
680 {
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
681 if (IsIPv4())
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
682 return strprintf("%u.%u.%u.%u", GetByte(3), GetByte(2), GetByte(1), GetByte(0));
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
683 else
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
684 return strprintf("%x:%x:%x:%x:%x:%x:%x:%x",
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
685 GetByte(15) << 8 | GetByte(14), GetByte(13) << 8 | GetByte(12),
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
686 GetByte(11) << 8 | GetByte(10), GetByte(9) << 8 | GetByte(8),
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
687 GetByte(7) << 8 | GetByte(6), GetByte(5) << 8 | GetByte(4),
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
688 GetByte(3) << 8 | GetByte(2), GetByte(1) << 8 | GetByte(0));
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
689 }
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
690
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
691 std::string CNetAddr::ToString() const
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
692 {
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
693 return ToStringIP();
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
694 }
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
695
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
696 bool operator==(const CNetAddr& a, const CNetAddr& b)
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
697 {
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
698 return (memcmp(a.ip, b.ip, 16) == 0);
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
699 }
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
700
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
701 bool operator!=(const CNetAddr& a, const CNetAddr& b)
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
702 {
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
703 return (memcmp(a.ip, b.ip, 16) != 0);
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
704 }
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
705
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
706 bool operator<(const CNetAddr& a, const CNetAddr& b)
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
707 {
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
708 return (memcmp(a.ip, b.ip, 16) < 0);
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
709 }
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
710
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
711 bool CNetAddr::GetInAddr(struct in_addr* pipv4Addr) const
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
712 {
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
713 if (!IsIPv4())
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
714 return false;
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
715 memcpy(pipv4Addr, ip+12, 4);
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
716 return true;
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
717 }
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
718
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
719 #ifdef USE_IPV6
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
720 bool CNetAddr::GetIn6Addr(struct in6_addr* pipv6Addr) const
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
721 {
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
722 memcpy(pipv6Addr, ip, 16);
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
723 return true;
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
724 }
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
725 #endif
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
726
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
727 // get canonical identifier of an address' group
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
728 // no two connections will be attempted to addresses with the same group
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
729 std::vector<unsigned char> CNetAddr::GetGroup() const
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
730 {
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
731 std::vector<unsigned char> vchRet;
1911
a9190d020909 CAddrMan: stochastic address manager
Pieter Wuille <pieter.wuille@gmail.com>
parents: 1856
diff changeset
732 int nClass = 0; // 0=IPv6, 1=IPv4, 254=local, 255=unroutable
1731
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
733 int nStartByte = 0;
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
734 int nBits = 16;
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
735
1911
a9190d020909 CAddrMan: stochastic address manager
Pieter Wuille <pieter.wuille@gmail.com>
parents: 1856
diff changeset
736 // all local addresses belong to the same group
a9190d020909 CAddrMan: stochastic address manager
Pieter Wuille <pieter.wuille@gmail.com>
parents: 1856
diff changeset
737 if (IsLocal())
a9190d020909 CAddrMan: stochastic address manager
Pieter Wuille <pieter.wuille@gmail.com>
parents: 1856
diff changeset
738 {
a9190d020909 CAddrMan: stochastic address manager
Pieter Wuille <pieter.wuille@gmail.com>
parents: 1856
diff changeset
739 nClass = 254;
a9190d020909 CAddrMan: stochastic address manager
Pieter Wuille <pieter.wuille@gmail.com>
parents: 1856
diff changeset
740 nBits = 0;
a9190d020909 CAddrMan: stochastic address manager
Pieter Wuille <pieter.wuille@gmail.com>
parents: 1856
diff changeset
741 }
a9190d020909 CAddrMan: stochastic address manager
Pieter Wuille <pieter.wuille@gmail.com>
parents: 1856
diff changeset
742
a9190d020909 CAddrMan: stochastic address manager
Pieter Wuille <pieter.wuille@gmail.com>
parents: 1856
diff changeset
743 // all unroutable addresses belong to the same group
1731
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
744 if (!IsRoutable())
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
745 {
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
746 nClass = 255;
1911
a9190d020909 CAddrMan: stochastic address manager
Pieter Wuille <pieter.wuille@gmail.com>
parents: 1856
diff changeset
747 nBits = 0;
1731
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
748 }
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
749 // for IPv4 addresses, '1' + the 16 higher-order bits of the IP
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
750 // includes mapped IPv4, SIIT translated IPv4, and the well-known prefix
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
751 else if (IsIPv4() || IsRFC6145() || IsRFC6052())
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
752 {
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
753 nClass = 1;
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
754 nStartByte = 12;
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
755 }
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
756 // for 6to4 tunneled addresses, use the encapsulated IPv4 address
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
757 else if (IsRFC3964())
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
758 {
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
759 nClass = 1;
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
760 nStartByte = 2;
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
761 }
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
762 // for Teredo-tunneled IPv6 addresses, use the encapsulated IPv4 address
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
763 else if (IsRFC4380())
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
764 {
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
765 vchRet.push_back(1);
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
766 vchRet.push_back(GetByte(3) ^ 0xFF);
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
767 vchRet.push_back(GetByte(2) ^ 0xFF);
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
768 return vchRet;
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
769 }
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
770 // for he.net, use /36 groups
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
771 else if (GetByte(15) == 0x20 && GetByte(14) == 0x11 && GetByte(13) == 0x04 && GetByte(12) == 0x70)
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
772 nBits = 36;
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
773 // for the rest of the IPv6 network, use /32 groups
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
774 else
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
775 nBits = 32;
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
776
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
777 vchRet.push_back(nClass);
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
778 while (nBits >= 8)
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
779 {
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
780 vchRet.push_back(GetByte(15 - nStartByte));
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
781 nStartByte++;
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
782 nBits -= 8;
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
783 }
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
784 if (nBits > 0)
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
785 vchRet.push_back(GetByte(15 - nStartByte) | ((1 << nBits) - 1));
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
786
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
787 return vchRet;
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
788 }
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
789
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
790 int64 CNetAddr::GetHash() const
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
791 {
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
792 uint256 hash = Hash(&ip[0], &ip[16]);
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
793 int64 nRet;
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
794 memcpy(&nRet, &hash, sizeof(nRet));
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
795 return nRet;
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
796 }
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
797
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
798 void CNetAddr::print() const
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
799 {
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
800 printf("CNetAddr(%s)\n", ToString().c_str());
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
801 }
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
802
2417
fa61c1977722 Support for multiple local addresses
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2363
diff changeset
803 // for IPv6 partners: for unknown/Teredo partners: for IPv4 partners:
fa61c1977722 Support for multiple local addresses
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2363
diff changeset
804 // 0 - unroutable // 0 - unroutable // 0 - unroutable
fa61c1977722 Support for multiple local addresses
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2363
diff changeset
805 // 1 - teredo // 1 - teredo // 1 - ipv4
fa61c1977722 Support for multiple local addresses
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2363
diff changeset
806 // 2 - tunneled ipv6 // 2 - tunneled ipv6
fa61c1977722 Support for multiple local addresses
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2363
diff changeset
807 // 3 - ipv4 // 3 - ipv6
fa61c1977722 Support for multiple local addresses
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2363
diff changeset
808 // 4 - ipv6 // 4 - ipv4
fa61c1977722 Support for multiple local addresses
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2363
diff changeset
809 int CNetAddr::GetReachabilityFrom(const CNetAddr *paddrPartner) const
fa61c1977722 Support for multiple local addresses
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2363
diff changeset
810 {
fa61c1977722 Support for multiple local addresses
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2363
diff changeset
811 if (!IsValid() || !IsRoutable())
fa61c1977722 Support for multiple local addresses
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2363
diff changeset
812 return 0;
fa61c1977722 Support for multiple local addresses
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2363
diff changeset
813 if (paddrPartner && paddrPartner->IsIPv4())
fa61c1977722 Support for multiple local addresses
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2363
diff changeset
814 return IsIPv4() ? 1 : 0;
fa61c1977722 Support for multiple local addresses
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2363
diff changeset
815 if (IsRFC4380())
fa61c1977722 Support for multiple local addresses
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2363
diff changeset
816 return 1;
fa61c1977722 Support for multiple local addresses
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2363
diff changeset
817 if (IsRFC3964() || IsRFC6052())
fa61c1977722 Support for multiple local addresses
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2363
diff changeset
818 return 2;
fa61c1977722 Support for multiple local addresses
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2363
diff changeset
819 bool fRealIPv6 = paddrPartner && !paddrPartner->IsRFC4380() && paddrPartner->IsValid() && paddrPartner->IsRoutable();
fa61c1977722 Support for multiple local addresses
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2363
diff changeset
820 if (fRealIPv6)
fa61c1977722 Support for multiple local addresses
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2363
diff changeset
821 return IsIPv4() ? 3 : 4;
fa61c1977722 Support for multiple local addresses
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2363
diff changeset
822 else
fa61c1977722 Support for multiple local addresses
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2363
diff changeset
823 return IsIPv4() ? 4 : 3;
fa61c1977722 Support for multiple local addresses
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2363
diff changeset
824 }
fa61c1977722 Support for multiple local addresses
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2363
diff changeset
825
1731
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
826 void CService::Init()
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
827 {
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
828 port = 0;
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
829 }
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
830
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
831 CService::CService()
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
832 {
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
833 Init();
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
834 }
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
835
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
836 CService::CService(const CNetAddr& cip, unsigned short portIn) : CNetAddr(cip), port(portIn)
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
837 {
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
838 }
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
839
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
840 CService::CService(const struct in_addr& ipv4Addr, unsigned short portIn) : CNetAddr(ipv4Addr), port(portIn)
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
841 {
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
842 }
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
843
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
844 #ifdef USE_IPV6
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
845 CService::CService(const struct in6_addr& ipv6Addr, unsigned short portIn) : CNetAddr(ipv6Addr), port(portIn)
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
846 {
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
847 }
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
848 #endif
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
849
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
850 CService::CService(const struct sockaddr_in& addr) : CNetAddr(addr.sin_addr), port(ntohs(addr.sin_port))
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
851 {
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
852 assert(addr.sin_family == AF_INET);
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
853 }
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
854
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
855 #ifdef USE_IPV6
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
856 CService::CService(const struct sockaddr_in6 &addr) : CNetAddr(addr.sin6_addr), port(ntohs(addr.sin6_port))
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
857 {
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
858 assert(addr.sin6_family == AF_INET6);
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
859 }
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
860 #endif
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
861
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
862 CService::CService(const char *pszIpPort, bool fAllowLookup)
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
863 {
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
864 Init();
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
865 CService ip;
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
866 if (Lookup(pszIpPort, ip, 0, fAllowLookup))
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
867 *this = ip;
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
868 }
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
869
1762
3ae3a30451cb Fix handling of default ports
Pieter Wuille <sipa@ulyssis.org>
parents: 1761
diff changeset
870 CService::CService(const char *pszIpPort, int portDefault, bool fAllowLookup)
1731
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
871 {
1762
3ae3a30451cb Fix handling of default ports
Pieter Wuille <sipa@ulyssis.org>
parents: 1761
diff changeset
872 Init();
3ae3a30451cb Fix handling of default ports
Pieter Wuille <sipa@ulyssis.org>
parents: 1761
diff changeset
873 CService ip;
3ae3a30451cb Fix handling of default ports
Pieter Wuille <sipa@ulyssis.org>
parents: 1761
diff changeset
874 if (Lookup(pszIpPort, ip, portDefault, fAllowLookup))
3ae3a30451cb Fix handling of default ports
Pieter Wuille <sipa@ulyssis.org>
parents: 1761
diff changeset
875 *this = ip;
1731
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
876 }
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
877
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
878 CService::CService(const std::string &strIpPort, bool fAllowLookup)
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
879 {
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
880 Init();
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
881 CService ip;
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
882 if (Lookup(strIpPort.c_str(), ip, 0, fAllowLookup))
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
883 *this = ip;
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
884 }
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
885
1762
3ae3a30451cb Fix handling of default ports
Pieter Wuille <sipa@ulyssis.org>
parents: 1761
diff changeset
886 CService::CService(const std::string &strIpPort, int portDefault, bool fAllowLookup)
1731
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
887 {
1762
3ae3a30451cb Fix handling of default ports
Pieter Wuille <sipa@ulyssis.org>
parents: 1761
diff changeset
888 Init();
3ae3a30451cb Fix handling of default ports
Pieter Wuille <sipa@ulyssis.org>
parents: 1761
diff changeset
889 CService ip;
3ae3a30451cb Fix handling of default ports
Pieter Wuille <sipa@ulyssis.org>
parents: 1761
diff changeset
890 if (Lookup(strIpPort.c_str(), ip, portDefault, fAllowLookup))
3ae3a30451cb Fix handling of default ports
Pieter Wuille <sipa@ulyssis.org>
parents: 1761
diff changeset
891 *this = ip;
1731
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
892 }
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
893
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
894 unsigned short CService::GetPort() const
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
895 {
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
896 return port;
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
897 }
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
898
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
899 bool operator==(const CService& a, const CService& b)
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
900 {
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
901 return (CNetAddr)a == (CNetAddr)b && a.port == b.port;
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
902 }
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
903
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
904 bool operator!=(const CService& a, const CService& b)
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
905 {
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
906 return (CNetAddr)a != (CNetAddr)b || a.port != b.port;
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
907 }
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
908
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
909 bool operator<(const CService& a, const CService& b)
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
910 {
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
911 return (CNetAddr)a < (CNetAddr)b || ((CNetAddr)a == (CNetAddr)b && a.port < b.port);
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
912 }
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
913
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
914 bool CService::GetSockAddr(struct sockaddr_in* paddr) const
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
915 {
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
916 if (!IsIPv4())
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
917 return false;
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
918 memset(paddr, 0, sizeof(struct sockaddr_in));
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
919 if (!GetInAddr(&paddr->sin_addr))
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
920 return false;
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
921 paddr->sin_family = AF_INET;
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
922 paddr->sin_port = htons(port);
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
923 return true;
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
924 }
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
925
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
926 #ifdef USE_IPV6
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
927 bool CService::GetSockAddr6(struct sockaddr_in6* paddr) const
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
928 {
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
929 memset(paddr, 0, sizeof(struct sockaddr_in6));
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
930 if (!GetIn6Addr(&paddr->sin6_addr))
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
931 return false;
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
932 paddr->sin6_family = AF_INET6;
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
933 paddr->sin6_port = htons(port);
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
934 return true;
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
935 }
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
936 #endif
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
937
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
938 std::vector<unsigned char> CService::GetKey() const
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
939 {
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
940 std::vector<unsigned char> vKey;
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
941 vKey.resize(18);
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
942 memcpy(&vKey[0], ip, 16);
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
943 vKey[16] = port / 0x100;
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
944 vKey[17] = port & 0x0FF;
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
945 return vKey;
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
946 }
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
947
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
948 std::string CService::ToStringPort() const
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
949 {
2476
a9b012461972 IPv6 node support
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2422
diff changeset
950 return strprintf("%i", port);
1731
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
951 }
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
952
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
953 std::string CService::ToStringIPPort() const
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
954 {
2476
a9b012461972 IPv6 node support
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2422
diff changeset
955 if (IsIPv4()) {
a9b012461972 IPv6 node support
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2422
diff changeset
956 return ToStringIP() + ":" + ToStringPort();
a9b012461972 IPv6 node support
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2422
diff changeset
957 } else {
a9b012461972 IPv6 node support
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2422
diff changeset
958 return "[" + ToStringIP() + "]:" + ToStringPort();
a9b012461972 IPv6 node support
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2422
diff changeset
959 }
1731
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
960 }
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
961
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
962 std::string CService::ToString() const
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
963 {
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
964 return ToStringIPPort();
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
965 }
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
966
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
967 void CService::print() const
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
968 {
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
969 printf("CService(%s)\n", ToString().c_str());
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
970 }
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
971
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
972 void CService::SetPort(unsigned short portIn)
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
973 {
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
974 port = portIn;
4a2d4c136998 Network stack refactor
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
975 }