|
|
@ -452,20 +452,18 @@ static bool Socks5(const std::string& strDest, int port, const ProxyCredentials |
|
|
|
return true; |
|
|
|
return true; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
bool ConnectSocketDirectly(const CService &addrConnect, SOCKET& hSocketRet, int nTimeout) |
|
|
|
SOCKET CreateSocket(const CService &addrConnect) |
|
|
|
{ |
|
|
|
{ |
|
|
|
hSocketRet = INVALID_SOCKET; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
struct sockaddr_storage sockaddr; |
|
|
|
struct sockaddr_storage sockaddr; |
|
|
|
socklen_t len = sizeof(sockaddr); |
|
|
|
socklen_t len = sizeof(sockaddr); |
|
|
|
if (!addrConnect.GetSockAddr((struct sockaddr*)&sockaddr, &len)) { |
|
|
|
if (!addrConnect.GetSockAddr((struct sockaddr*)&sockaddr, &len)) { |
|
|
|
LogPrintf("Cannot connect to %s: unsupported network\n", addrConnect.ToString()); |
|
|
|
LogPrintf("Cannot create socket for %s: unsupported network\n", addrConnect.ToString()); |
|
|
|
return false; |
|
|
|
return INVALID_SOCKET; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
SOCKET hSocket = socket(((struct sockaddr*)&sockaddr)->sa_family, SOCK_STREAM, IPPROTO_TCP); |
|
|
|
SOCKET hSocket = socket(((struct sockaddr*)&sockaddr)->sa_family, SOCK_STREAM, IPPROTO_TCP); |
|
|
|
if (hSocket == INVALID_SOCKET) |
|
|
|
if (hSocket == INVALID_SOCKET) |
|
|
|
return false; |
|
|
|
return INVALID_SOCKET; |
|
|
|
|
|
|
|
|
|
|
|
#ifdef SO_NOSIGPIPE |
|
|
|
#ifdef SO_NOSIGPIPE |
|
|
|
int set = 1; |
|
|
|
int set = 1; |
|
|
@ -479,9 +477,24 @@ bool ConnectSocketDirectly(const CService &addrConnect, SOCKET& hSocketRet, int |
|
|
|
// Set to non-blocking
|
|
|
|
// Set to non-blocking
|
|
|
|
if (!SetSocketNonBlocking(hSocket, true)) { |
|
|
|
if (!SetSocketNonBlocking(hSocket, true)) { |
|
|
|
CloseSocket(hSocket); |
|
|
|
CloseSocket(hSocket); |
|
|
|
return error("ConnectSocketDirectly: Setting socket to non-blocking failed, error %s\n", NetworkErrorString(WSAGetLastError())); |
|
|
|
LogPrintf("ConnectSocketDirectly: Setting socket to non-blocking failed, error %s\n", NetworkErrorString(WSAGetLastError())); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
return hSocket; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bool ConnectSocketDirectly(const CService &addrConnect, SOCKET& hSocket, int nTimeout) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
struct sockaddr_storage sockaddr; |
|
|
|
|
|
|
|
socklen_t len = sizeof(sockaddr); |
|
|
|
|
|
|
|
if (hSocket == INVALID_SOCKET) { |
|
|
|
|
|
|
|
LogPrintf("Cannot connect to %s: invalid socket\n", addrConnect.ToString()); |
|
|
|
|
|
|
|
return false; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
if (!addrConnect.GetSockAddr((struct sockaddr*)&sockaddr, &len)) { |
|
|
|
|
|
|
|
LogPrintf("Cannot connect to %s: unsupported network\n", addrConnect.ToString()); |
|
|
|
|
|
|
|
CloseSocket(hSocket); |
|
|
|
|
|
|
|
return false; |
|
|
|
|
|
|
|
} |
|
|
|
if (connect(hSocket, (struct sockaddr*)&sockaddr, len) == SOCKET_ERROR) |
|
|
|
if (connect(hSocket, (struct sockaddr*)&sockaddr, len) == SOCKET_ERROR) |
|
|
|
{ |
|
|
|
{ |
|
|
|
int nErr = WSAGetLastError(); |
|
|
|
int nErr = WSAGetLastError(); |
|
|
@ -534,8 +547,6 @@ bool ConnectSocketDirectly(const CService &addrConnect, SOCKET& hSocketRet, int |
|
|
|
return false; |
|
|
|
return false; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
hSocketRet = hSocket; |
|
|
|
|
|
|
|
return true; |
|
|
|
return true; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
@ -587,9 +598,8 @@ bool IsProxy(const CNetAddr &addr) { |
|
|
|
return false; |
|
|
|
return false; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
bool ConnectThroughProxy(const proxyType &proxy, const std::string& strDest, int port, SOCKET& hSocketRet, int nTimeout, bool *outProxyConnectionFailed) |
|
|
|
bool ConnectThroughProxy(const proxyType &proxy, const std::string& strDest, int port, SOCKET& hSocket, int nTimeout, bool *outProxyConnectionFailed) |
|
|
|
{ |
|
|
|
{ |
|
|
|
SOCKET hSocket = INVALID_SOCKET; |
|
|
|
|
|
|
|
// first connect to proxy server
|
|
|
|
// first connect to proxy server
|
|
|
|
if (!ConnectSocketDirectly(proxy.proxy, hSocket, nTimeout)) { |
|
|
|
if (!ConnectSocketDirectly(proxy.proxy, hSocket, nTimeout)) { |
|
|
|
if (outProxyConnectionFailed) |
|
|
|
if (outProxyConnectionFailed) |
|
|
@ -601,14 +611,16 @@ bool ConnectThroughProxy(const proxyType &proxy, const std::string& strDest, int |
|
|
|
ProxyCredentials random_auth; |
|
|
|
ProxyCredentials random_auth; |
|
|
|
static std::atomic_int counter(0); |
|
|
|
static std::atomic_int counter(0); |
|
|
|
random_auth.username = random_auth.password = strprintf("%i", counter++); |
|
|
|
random_auth.username = random_auth.password = strprintf("%i", counter++); |
|
|
|
if (!Socks5(strDest, (unsigned short)port, &random_auth, hSocket)) |
|
|
|
if (!Socks5(strDest, (unsigned short)port, &random_auth, hSocket)) { |
|
|
|
|
|
|
|
CloseSocket(hSocket); |
|
|
|
return false; |
|
|
|
return false; |
|
|
|
|
|
|
|
} |
|
|
|
} else { |
|
|
|
} else { |
|
|
|
if (!Socks5(strDest, (unsigned short)port, 0, hSocket)) |
|
|
|
if (!Socks5(strDest, (unsigned short)port, 0, hSocket)) { |
|
|
|
|
|
|
|
CloseSocket(hSocket); |
|
|
|
return false; |
|
|
|
return false; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
hSocketRet = hSocket; |
|
|
|
|
|
|
|
return true; |
|
|
|
return true; |
|
|
|
} |
|
|
|
} |
|
|
|
bool LookupSubNet(const char* pszName, CSubNet& ret) |
|
|
|
bool LookupSubNet(const char* pszName, CSubNet& ret) |
|
|
|