|
|
|
@ -19,6 +19,7 @@
@@ -19,6 +19,7 @@
|
|
|
|
|
#ifdef HAVE_GETADDRINFO_A |
|
|
|
|
#include <netdb.h> |
|
|
|
|
#endif |
|
|
|
|
#include <atomic> |
|
|
|
|
|
|
|
|
|
#ifndef WIN32 |
|
|
|
|
#if HAVE_INET_PTON |
|
|
|
@ -44,6 +45,7 @@ bool fNameLookup = DEFAULT_NAME_LOOKUP;
@@ -44,6 +45,7 @@ bool fNameLookup = DEFAULT_NAME_LOOKUP;
|
|
|
|
|
|
|
|
|
|
// Need ample time for negotiation for very slow proxies such as Tor (milliseconds)
|
|
|
|
|
static const int SOCKS5_RECV_TIMEOUT = 20 * 1000; |
|
|
|
|
static std::atomic<bool> interruptSocks5Recv(false); |
|
|
|
|
|
|
|
|
|
enum Network ParseNetwork(std::string net) { |
|
|
|
|
boost::to_lower(net); |
|
|
|
@ -206,7 +208,7 @@ struct timeval MillisToTimeval(int64_t nTimeout)
@@ -206,7 +208,7 @@ struct timeval MillisToTimeval(int64_t nTimeout)
|
|
|
|
|
/**
|
|
|
|
|
* Read bytes from socket. This will either read the full number of bytes requested |
|
|
|
|
* or return False on error or timeout. |
|
|
|
|
* This function can be interrupted by boost thread interrupt. |
|
|
|
|
* This function can be interrupted by calling InterruptSocks5() |
|
|
|
|
* |
|
|
|
|
* @param data Buffer to receive into |
|
|
|
|
* @param len Length of data to receive |
|
|
|
@ -246,7 +248,8 @@ bool static InterruptibleRecv(char* data, size_t len, int timeout, SOCKET& hSock
@@ -246,7 +248,8 @@ bool static InterruptibleRecv(char* data, size_t len, int timeout, SOCKET& hSock
|
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
boost::this_thread::interruption_point(); |
|
|
|
|
if (interruptSocks5Recv) |
|
|
|
|
return false; |
|
|
|
|
curTime = GetTimeMillis(); |
|
|
|
|
} |
|
|
|
|
return len == 0; |
|
|
|
@ -715,3 +718,8 @@ bool SetSocketNonBlocking(SOCKET& hSocket, bool fNonBlocking)
@@ -715,3 +718,8 @@ bool SetSocketNonBlocking(SOCKET& hSocket, bool fNonBlocking)
|
|
|
|
|
|
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void InterruptSocks5(bool interrupt) |
|
|
|
|
{ |
|
|
|
|
interruptSocks5Recv = interrupt; |
|
|
|
|
} |
|
|
|
|