| 203 | } |
| 204 | |
| 205 | bool static Socks5(string strDest, int port, SOCKET& hSocket) { |
| 206 | LogPrint(BCLog::INFO, "SOCKS5 connecting %s\n", strDest); |
| 207 | if (strDest.size() > 255) { |
| 208 | closesocket(hSocket); |
| 209 | return ERRORMSG("Hostname too long"); |
| 210 | } |
| 211 | char pszSocks5Init[] = "\5\1\0"; |
| 212 | ssize_t nSize = sizeof(pszSocks5Init) - 1; |
| 213 | |
| 214 | ssize_t ret = send(hSocket, pszSocks5Init, nSize, MSG_NOSIGNAL); |
| 215 | if (ret != nSize) { |
| 216 | closesocket(hSocket); |
| 217 | return ERRORMSG("Error sending to proxy"); |
| 218 | } |
| 219 | char pchRet1[2]; |
| 220 | if (recv(hSocket, pchRet1, 2, 0) != 2) { |
| 221 | closesocket(hSocket); |
| 222 | return ERRORMSG("Error reading proxy response"); |
| 223 | } |
| 224 | if (pchRet1[0] != 0x05 || pchRet1[1] != 0x00) { |
| 225 | closesocket(hSocket); |
| 226 | return ERRORMSG("Proxy failed to initialize"); |
| 227 | } |
| 228 | string strSocks5("\5\1"); |
| 229 | strSocks5 += '\000'; |
| 230 | strSocks5 += '\003'; |
| 231 | strSocks5 += static_cast<char>(min((int)strDest.size(), 255)); |
| 232 | strSocks5 += strDest; |
| 233 | strSocks5 += static_cast<char>((port >> 8) & 0xFF); |
| 234 | strSocks5 += static_cast<char>((port >> 0) & 0xFF); |
| 235 | ret = send(hSocket, strSocks5.c_str(), strSocks5.size(), MSG_NOSIGNAL); |
| 236 | if (ret != (ssize_t)strSocks5.size()) { |
| 237 | closesocket(hSocket); |
| 238 | return ERRORMSG("Error sending to proxy"); |
| 239 | } |
| 240 | char pchRet2[4]; |
| 241 | if (recv(hSocket, pchRet2, 4, 0) != 4) { |
| 242 | closesocket(hSocket); |
| 243 | return ERRORMSG("Error reading proxy response"); |
| 244 | } |
| 245 | if (pchRet2[0] != 0x05) { |
| 246 | closesocket(hSocket); |
| 247 | return ERRORMSG("Proxy failed to accept request"); |
| 248 | } |
| 249 | if (pchRet2[1] != 0x00) { |
| 250 | closesocket(hSocket); |
| 251 | switch (pchRet2[1]) { |
| 252 | case 0x01: |
| 253 | return ERRORMSG("Proxy error: general failure"); |
| 254 | case 0x02: |
| 255 | return ERRORMSG("Proxy error: connection not allowed"); |
| 256 | case 0x03: |
| 257 | return ERRORMSG("Proxy error: network unreachable"); |
| 258 | case 0x04: |
| 259 | return ERRORMSG("Proxy error: host unreachable"); |
| 260 | case 0x05: |
| 261 | return ERRORMSG("Proxy error: connection refused"); |
| 262 | case 0x06: |
no test coverage detected