@ -385,19 +385,16 @@ CNode* CConnman::ConnectNode(CAddress addrConnect, const char *pszDest, bool fCo
pszDest ? pszDest : addrConnect . ToString ( ) ,
pszDest ? 0.0 : ( double ) ( GetAdjustedTime ( ) - addrConnect . nTime ) / 3600.0 ) ;
// Connect
SOCKET hSocket ;
bool proxyConnectionFailed = false ;
if ( pszDest ? ConnectSocketByName ( addrConnect , hSocket , pszDest , Params ( ) . GetDefaultPort ( ) , nConnectTimeout , & proxyConnectionFailed ) :
ConnectSocket ( addrConnect , hSocket , nConnectTimeout , & proxyConnectionFailed ) )
{
if ( ! IsSelectableSocket ( hSocket ) ) {
LogPrintf ( " Cannot create connection: non-selectable socket created (fd >= FD_SETSIZE ?) \n " ) ;
CloseSocket ( hSocket ) ;
return nullptr ;
}
if ( pszDest & & addrConnect . IsValid ( ) ) {
// Resolve
const int default_port = Params ( ) . GetDefaultPort ( ) ;
if ( pszDest ) {
std : : vector < CService > resolved ;
if ( Lookup ( pszDest , resolved , default_port , fNameLookup & & ! HaveNameProxy ( ) , 256 ) & & ! resolved . empty ( ) ) {
addrConnect = CAddress ( resolved [ GetRand ( resolved . size ( ) ) ] , NODE_NONE ) ;
if ( ! addrConnect . IsValid ( ) ) {
LogPrint ( BCLog : : NET , " Resolver returned invalid address %s for %s " , addrConnect . ToString ( ) , pszDest ) ;
return nullptr ;
}
// 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.
// Also store the name we used to connect in that CNode, so that future FindNode() calls to that
@ -407,13 +404,40 @@ CNode* CConnman::ConnectNode(CAddress addrConnect, const char *pszDest, bool fCo
if ( pnode )
{
pnode - > MaybeSetAddrName ( std : : string ( pszDest ) ) ;
CloseSocket ( hSocket ) ;
LogPrintf ( " Failed to open new connection, already connected \n " ) ;
return nullptr ;
}
}
}
addrman . Attempt ( addrConnect , fCountFailure ) ;
// 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 ) ;
}
} 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
NodeId id = GetNewNodeId ( ) ;
@ -424,10 +448,6 @@ CNode* CConnman::ConnectNode(CAddress addrConnect, const char *pszDest, bool fCo
pnode - > AddRef ( ) ;
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 ;
@ -1912,11 +1932,9 @@ void CConnman::ThreadOpenAddedConnections()
// the addednodeinfo state might change.
break ;
}
// If strAddedNode is an IP/port, decode it immediately, so
// OpenNetworkConnection can detect existing connections to that IP/port.
tried = true ;
C Service service ( LookupNumeric ( info . strAddedNode . c_str ( ) , Params ( ) . GetDefaultPort ( ) ) ) ;
OpenNetworkConnection ( CAddress( service , NODE_NONE ) , false , & grant , info . strAddedNode . c_str ( ) , false , false , true ) ;
CAddress addr ( CService ( ) , NODE_NONE ) ;
OpenNetworkConnection ( addr , false , & grant , info . strAddedNode . c_str ( ) , false , false , true ) ;
if ( ! interruptNet . sleep_for ( std : : chrono : : milliseconds ( 500 ) ) )
return ;
}