@ -380,19 +380,16 @@ CNode* CConnman::ConnectNode(CAddress addrConnect, const char *pszDest, bool fCo
pszDest ? pszDest : addrConnect . ToString ( ) ,
pszDest ? pszDest : addrConnect . ToString ( ) ,
pszDest ? 0.0 : ( double ) ( GetAdjustedTime ( ) - addrConnect . nTime ) / 3600.0 ) ;
pszDest ? 0.0 : ( double ) ( GetAdjustedTime ( ) - addrConnect . nTime ) / 3600.0 ) ;
// Connect
// Resolve
SOCKET hSocket ;
const int default_port = Params ( ) . GetDefaultPort ( ) ;
bool proxyConnectionFailed = false ;
if ( pszDest ) {
if ( pszDest ? ConnectSocketByName ( addrConnect , hSocket , pszDest , Params ( ) . GetDefaultPort ( ) , nConnectTimeout , & proxyConnectionFailed ) :
std : : vector < CService > resolved ;
ConnectSocket ( addrConnect , hSocket , nConnectTimeout , & proxyConnectionFailed ) )
if ( Lookup ( pszDest , resolved , default_port , fNameLookup & & ! HaveNameProxy ( ) , 256 ) & & ! resolved . empty ( ) ) {
{
addrConnect = CAddress ( resolved [ GetRand ( resolved . size ( ) ) ] , NODE_NONE ) ;
if ( ! IsSelectableSocket ( hSocket ) ) {
if ( ! addrConnect . IsValid ( ) ) {
LogPrintf ( " Cannot create connection: non-selectable socket created (fd >= FD_SETSIZE ?) \n " ) ;
LogPrint ( BCLog : : NET , " Resolver returned invalid address %s for %s " , addrConnect . ToString ( ) , pszDest ) ;
CloseSocket ( hSocket ) ;
return nullptr ;
return nullptr ;
}
}
if ( pszDest & & addrConnect . IsValid ( ) ) {
// It is possible that we already have a connection to the IP/port pszDest resolved to.
// It is possible that we already have a connection to the IP/port pszDest resolved to.
// In that case, drop the connection that was just created, and return the existing CNode instead.
// In that case, drop the connection that was just created, and return the existing CNode instead.
// Also store the name we used to connect in that CNode, so that future FindNode() calls to that
// Also store the name we used to connect in that CNode, so that future FindNode() calls to that
@ -402,13 +399,40 @@ CNode* CConnman::ConnectNode(CAddress addrConnect, const char *pszDest, bool fCo
if ( pnode )
if ( pnode )
{
{
pnode - > MaybeSetAddrName ( std : : string ( pszDest ) ) ;
pnode - > MaybeSetAddrName ( std : : string ( pszDest ) ) ;
CloseSocket ( hSocket ) ;
LogPrintf ( " Failed to open new connection, already connected \n " ) ;
LogPrintf ( " Failed to open new connection, already connected \n " ) ;
return nullptr ;
return nullptr ;
}
}
}
}
}
// Connect
bool connected = false ;
SOCKET hSocket ;
proxyType proxy ;
if ( addrConnect . IsValid ( ) ) {
bool proxyConnectionFailed = false ;
if ( GetProxy ( addrConnect . GetNetwork ( ) , proxy ) )
connected = ConnectThroughProxy ( proxy , addrConnect . ToStringIP ( ) , addrConnect . GetPort ( ) , hSocket , nConnectTimeout , & proxyConnectionFailed ) ;
else // no proxy needed (none set for target network)
connected = ConnectSocketDirectly ( addrConnect , hSocket , nConnectTimeout ) ;
if ( ! proxyConnectionFailed ) {
// If a connection to the node was attempted, and failure (if any) is not caused by a problem connecting to
// the proxy, mark this as an attempt.
addrman . Attempt ( addrConnect , fCountFailure ) ;
addrman . Attempt ( addrConnect , fCountFailure ) ;
}
} else if ( pszDest & & GetNameProxy ( proxy ) ) {
std : : string host ;
int port = default_port ;
SplitHostPort ( std : : string ( pszDest ) , port , host ) ;
connected = ConnectThroughProxy ( proxy , host , port , hSocket , nConnectTimeout , nullptr ) ;
}
if ( connected ) {
if ( ! IsSelectableSocket ( hSocket ) ) {
LogPrintf ( " Cannot create connection: non-selectable socket created (fd >= FD_SETSIZE ?) \n " ) ;
CloseSocket ( hSocket ) ;
return nullptr ;
}
// Add node
// Add node
NodeId id = GetNewNodeId ( ) ;
NodeId id = GetNewNodeId ( ) ;
@ -419,10 +443,6 @@ CNode* CConnman::ConnectNode(CAddress addrConnect, const char *pszDest, bool fCo
pnode - > AddRef ( ) ;
pnode - > AddRef ( ) ;
return pnode ;
return pnode ;
} else if ( ! proxyConnectionFailed ) {
// If connecting to the node failed, and failure is not caused by a problem connecting to
// the proxy, mark this as an attempt.
addrman . Attempt ( addrConnect , fCountFailure ) ;
}
}
return nullptr ;
return nullptr ;