@@ -35,15 +35,14 @@ void ThreadOpenAddedConnections2(void* parg);
35
35
void ThreadMapPort2 (void * parg);
36
36
#endif
37
37
void ThreadDNSAddressSeed2 (void * parg);
38
- bool OpenNetworkConnection (const CAddress& addrConnect);
38
+ bool OpenNetworkConnection (const CAddress& addrConnect, const char *strDest = NULL );
39
39
40
40
41
41
42
42
//
43
43
// Global state variables
44
44
//
45
45
bool fClient = false ;
46
- bool fAllowDNS = false ;
47
46
static bool fUseUPnP = false ;
48
47
uint64 nLocalServices = (fClient ? 0 : NODE_NETWORK);
49
48
CAddress addrLocalHost (CService(" 0.0.0.0" , 0 ), nLocalServices);
@@ -307,6 +306,15 @@ CNode* FindNode(const CNetAddr& ip)
307
306
return NULL ;
308
307
}
309
308
309
+ CNode* FindNode (std::string addrName)
310
+ {
311
+ LOCK (cs_vNodes);
312
+ BOOST_FOREACH (CNode* pnode, vNodes)
313
+ if (pnode->addrName == addrName)
314
+ return (pnode);
315
+ return NULL ;
316
+ }
317
+
310
318
CNode* FindNode (const CService& addr)
311
319
{
312
320
{
@@ -318,35 +326,38 @@ CNode* FindNode(const CService& addr)
318
326
return NULL ;
319
327
}
320
328
321
- CNode* ConnectNode (CAddress addrConnect, int64 nTimeout)
329
+ CNode* ConnectNode (CAddress addrConnect, const char *pszDest, int64 nTimeout)
322
330
{
323
- if ((CNetAddr)addrConnect == (CNetAddr)addrLocalHost)
324
- return NULL ;
331
+ if (pszDest != NULL ) {
332
+ if ((CNetAddr)addrConnect == (CNetAddr)addrLocalHost)
333
+ return NULL ;
325
334
326
- // Look for an existing connection
327
- CNode* pnode = FindNode ((CService)addrConnect);
328
- if (pnode)
329
- {
330
- if (nTimeout != 0 )
331
- pnode->AddRef (nTimeout);
332
- else
333
- pnode->AddRef ();
334
- return pnode;
335
+ // Look for an existing connection
336
+ CNode* pnode = FindNode ((CService)addrConnect);
337
+ if (pnode)
338
+ {
339
+ if (nTimeout != 0 )
340
+ pnode->AddRef (nTimeout);
341
+ else
342
+ pnode->AddRef ();
343
+ return pnode;
344
+ }
335
345
}
336
346
347
+
337
348
// / debug print
338
349
printf (" trying connection %s lastseen=%.1fhrs\n " ,
339
- addrConnect.ToString ().c_str (),
340
- (double )(addrConnect.nTime - GetAdjustedTime ())/3600.0 );
341
-
342
- addrman.Attempt (addrConnect);
350
+ pszDest ? pszDest : addrConnect.ToString ().c_str (),
351
+ pszDest ? 0 : (double )(addrConnect.nTime - GetAdjustedTime ())/3600.0 );
343
352
344
353
// Connect
345
354
SOCKET hSocket;
346
- if (ConnectSocket (addrConnect, hSocket))
355
+ if (pszDest ? ConnectSocketByName (addrConnect, hSocket, pszDest, GetDefaultPort ()) : ConnectSocket (addrConnect, hSocket))
347
356
{
357
+ addrman.Attempt (addrConnect);
358
+
348
359
// / debug print
349
- printf (" connected %s\n " , addrConnect.ToString ().c_str ());
360
+ printf (" connected %s\n " , pszDest ? pszDest : addrConnect.ToString ().c_str ());
350
361
351
362
// Set to nonblocking
352
363
#ifdef WIN32
@@ -359,11 +370,12 @@ CNode* ConnectNode(CAddress addrConnect, int64 nTimeout)
359
370
#endif
360
371
361
372
// Add node
362
- CNode* pnode = new CNode (hSocket, addrConnect, false );
373
+ CNode* pnode = new CNode (hSocket, addrConnect, pszDest ? pszDest : " " , false );
363
374
if (nTimeout != 0 )
364
375
pnode->AddRef (nTimeout);
365
376
else
366
377
pnode->AddRef ();
378
+
367
379
{
368
380
LOCK (cs_vNodes);
369
381
vNodes.push_back (pnode);
@@ -389,7 +401,7 @@ void CNode::CloseSocketDisconnect()
389
401
{
390
402
if (fDebug )
391
403
printf (" %s " , DateTimeStrFormat (" %x %H:%M:%S" , GetTime ()).c_str ());
392
- printf (" disconnecting node %s\n " , addr. ToString () .c_str ());
404
+ printf (" disconnecting node %s\n " , addrName .c_str ());
393
405
closesocket (hSocket);
394
406
hSocket = INVALID_SOCKET;
395
407
vRecv.clear ();
@@ -444,7 +456,7 @@ bool CNode::Misbehaving(int howmuch)
444
456
{
445
457
if (addr.IsLocal ())
446
458
{
447
- printf (" Warning: local node %s misbehaving\n " , addr. ToString () .c_str ());
459
+ printf (" Warning: local node %s misbehaving\n " , addrName .c_str ());
448
460
return false ;
449
461
}
450
462
@@ -458,7 +470,7 @@ bool CNode::Misbehaving(int howmuch)
458
470
setBanned[addr] = banTime;
459
471
}
460
472
CloseSocketDisconnect ();
461
- printf (" Disconnected %s for misbehavior (score=%d)\n " , addr. ToString () .c_str (), nMisbehavior);
473
+ printf (" Disconnected %s for misbehavior (score=%d)\n " , addrName .c_str (), nMisbehavior);
462
474
return true ;
463
475
}
464
476
return false ;
@@ -675,7 +687,7 @@ void ThreadSocketHandler2(void* parg)
675
687
else
676
688
{
677
689
printf (" accepted connection %s\n " , addr.ToString ().c_str ());
678
- CNode* pnode = new CNode (hSocket, addr, true );
690
+ CNode* pnode = new CNode (hSocket, addr, " " , true );
679
691
pnode->AddRef ();
680
692
{
681
693
LOCK (cs_vNodes);
@@ -1025,20 +1037,25 @@ void ThreadDNSAddressSeed2(void* parg)
1025
1037
printf (" Loading addresses from DNS seeds (could take a while)\n " );
1026
1038
1027
1039
for (unsigned int seed_idx = 0 ; seed_idx < ARRAYLEN (strDNSSeed); seed_idx++) {
1028
- vector<CNetAddr> vaddr;
1029
- vector<CAddress> vAdd;
1030
- if (LookupHost (strDNSSeed[seed_idx][1 ], vaddr))
1031
- {
1032
- BOOST_FOREACH (CNetAddr& ip, vaddr)
1040
+ if (fProxyNameLookup ) {
1041
+ CAddress addr;
1042
+ OpenNetworkConnection (addr, strDNSSeed[seed_idx][1 ]);
1043
+ } else {
1044
+ vector<CNetAddr> vaddr;
1045
+ vector<CAddress> vAdd;
1046
+ if (LookupHost (strDNSSeed[seed_idx][1 ], vaddr))
1033
1047
{
1034
- int nOneDay = 24 *3600 ;
1035
- CAddress addr = CAddress (CService (ip, GetDefaultPort ()));
1036
- addr.nTime = GetTime () - 3 *nOneDay - GetRand (4 *nOneDay); // use a random age between 3 and 7 days old
1037
- vAdd.push_back (addr);
1038
- found++;
1048
+ BOOST_FOREACH (CNetAddr& ip, vaddr)
1049
+ {
1050
+ int nOneDay = 24 *3600 ;
1051
+ CAddress addr = CAddress (CService (ip, GetDefaultPort ()));
1052
+ addr.nTime = GetTime () - 3 *nOneDay - GetRand (4 *nOneDay); // use a random age between 3 and 7 days old
1053
+ vAdd.push_back (addr);
1054
+ found++;
1055
+ }
1039
1056
}
1057
+ addrman.Add (vAdd, CNetAddr (strDNSSeed[seed_idx][0 ], true ));
1040
1058
}
1041
- addrman.Add (vAdd, CNetAddr (strDNSSeed[seed_idx][0 ], true ));
1042
1059
}
1043
1060
}
1044
1061
@@ -1199,9 +1216,8 @@ void ThreadOpenConnections2(void* parg)
1199
1216
{
1200
1217
BOOST_FOREACH (string strAddr, mapMultiArgs[" -connect" ])
1201
1218
{
1202
- CAddress addr (CService (strAddr, GetDefaultPort (), fAllowDNS ));
1203
- if (addr.IsValid ())
1204
- OpenNetworkConnection (addr);
1219
+ CAddress addr (CService (" 0.0.0.0:0" ));
1220
+ OpenNetworkConnection (addr, strAddr.c_str ());
1205
1221
for (int i = 0 ; i < 10 && i < nLoop; i++)
1206
1222
{
1207
1223
Sleep (500 );
@@ -1325,11 +1341,25 @@ void ThreadOpenAddedConnections2(void* parg)
1325
1341
if (mapArgs.count (" -addnode" ) == 0 )
1326
1342
return ;
1327
1343
1344
+ if (fProxyNameLookup ) {
1345
+ while (!fShutdown ) {
1346
+ BOOST_FOREACH (string& strAddNode, mapMultiArgs[" -addnode" ]) {
1347
+ CAddress addr;
1348
+ OpenNetworkConnection (addr, strAddNode.c_str ());
1349
+ Sleep (500 );
1350
+ }
1351
+ vnThreadsRunning[THREAD_ADDEDCONNECTIONS]--;
1352
+ Sleep (120000 ); // Retry every 2 minutes
1353
+ vnThreadsRunning[THREAD_ADDEDCONNECTIONS]++;
1354
+ }
1355
+ return ;
1356
+ }
1357
+
1328
1358
vector<vector<CService> > vservAddressesToAdd (0 );
1329
1359
BOOST_FOREACH (string& strAddNode, mapMultiArgs[" -addnode" ])
1330
1360
{
1331
1361
vector<CService> vservNode (0 );
1332
- if (Lookup (strAddNode.c_str (), vservNode, GetDefaultPort (), fAllowDNS , 0 ))
1362
+ if (Lookup (strAddNode.c_str (), vservNode, GetDefaultPort (), fNameLookup , 0 ))
1333
1363
{
1334
1364
vservAddressesToAdd.push_back (vservNode);
1335
1365
{
@@ -1343,7 +1373,7 @@ void ThreadOpenAddedConnections2(void* parg)
1343
1373
{
1344
1374
vector<vector<CService> > vservConnectAddresses = vservAddressesToAdd;
1345
1375
// Attempt to connect to each IP for each addnode entry until at least one is successful per addnode entry
1346
- // (keeping in mind that addnode entries can have many IPs if fAllowDNS )
1376
+ // (keeping in mind that addnode entries can have many IPs if fNameLookup )
1347
1377
{
1348
1378
LOCK (cs_vNodes);
1349
1379
BOOST_FOREACH (CNode* pnode, vNodes)
@@ -1373,19 +1403,23 @@ void ThreadOpenAddedConnections2(void* parg)
1373
1403
}
1374
1404
}
1375
1405
1376
- bool OpenNetworkConnection (const CAddress& addrConnect)
1406
+ bool OpenNetworkConnection (const CAddress& addrConnect, const char *strDest )
1377
1407
{
1378
1408
//
1379
1409
// Initiate outbound network connection
1380
1410
//
1381
1411
if (fShutdown )
1382
1412
return false ;
1383
- if ((CNetAddr)addrConnect == (CNetAddr)addrLocalHost || !addrConnect.IsIPv4 () ||
1384
- FindNode ((CNetAddr)addrConnect) || CNode::IsBanned (addrConnect))
1413
+ if (!strDest)
1414
+ if ((CNetAddr)addrConnect == (CNetAddr)addrLocalHost || !addrConnect.IsIPv4 () ||
1415
+ FindNode ((CNetAddr)addrConnect) || CNode::IsBanned (addrConnect) ||
1416
+ FindNode (addrConnect.ToStringIPPort ().c_str ()))
1417
+ return false ;
1418
+ if (strDest && FindNode (strDest))
1385
1419
return false ;
1386
1420
1387
1421
vnThreadsRunning[THREAD_OPENCONNECTIONS]--;
1388
- CNode* pnode = ConnectNode (addrConnect);
1422
+ CNode* pnode = ConnectNode (addrConnect, strDest );
1389
1423
vnThreadsRunning[THREAD_OPENCONNECTIONS]++;
1390
1424
if (fShutdown )
1391
1425
return false ;
0 commit comments