@@ -517,18 +517,24 @@ static void LogConnectFailure(bool manual_connection, const char* fmt, const Arg
517
517
}
518
518
}
519
519
520
- bool ConnectSocketDirectly (const CService &addrConnect, const Sock& sock, int nTimeout , bool manual_connection)
520
+ std::unique_ptr<Sock> ConnectDirectly (const CService& dest , bool manual_connection)
521
521
{
522
+ auto sock = CreateSock (dest.GetSAFamily ());
523
+ if (!sock) {
524
+ LogPrintLevel (BCLog::NET, BCLog::Level::Error, " Cannot create a socket for connecting to %s\n " , dest.ToStringAddrPort ());
525
+ return {};
526
+ }
527
+
522
528
// Create a sockaddr from the specified service.
523
529
struct sockaddr_storage sockaddr;
524
530
socklen_t len = sizeof (sockaddr);
525
- if (!addrConnect .GetSockAddr ((struct sockaddr *)&sockaddr, &len)) {
526
- LogPrintf (" Cannot connect to %s: unsupported network\n " , addrConnect .ToStringAddrPort ());
527
- return false ;
531
+ if (!dest .GetSockAddr ((struct sockaddr *)&sockaddr, &len)) {
532
+ LogPrintf (" Cannot connect to %s: unsupported network\n " , dest .ToStringAddrPort ());
533
+ return {} ;
528
534
}
529
535
530
- // Connect to the addrConnect service on the hSocket socket.
531
- if (sock. Connect (reinterpret_cast <struct sockaddr *>(&sockaddr), len) == SOCKET_ERROR) {
536
+ // Connect to the dest service on the hSocket socket.
537
+ if (sock-> Connect (reinterpret_cast <struct sockaddr *>(&sockaddr), len) == SOCKET_ERROR) {
532
538
int nErr = WSAGetLastError ();
533
539
// WSAEINVAL is here because some legacy version of winsock uses it
534
540
if (nErr == WSAEINPROGRESS || nErr == WSAEWOULDBLOCK || nErr == WSAEINVAL)
@@ -538,14 +544,14 @@ bool ConnectSocketDirectly(const CService &addrConnect, const Sock& sock, int nT
538
544
// synchronously to check for successful connection with a timeout.
539
545
const Sock::Event requested = Sock::RECV | Sock::SEND;
540
546
Sock::Event occurred;
541
- if (!sock. Wait (std::chrono::milliseconds{nTimeout }, requested, &occurred)) {
547
+ if (!sock-> Wait (std::chrono::milliseconds{nConnectTimeout }, requested, &occurred)) {
542
548
LogPrintf (" wait for connect to %s failed: %s\n " ,
543
- addrConnect .ToStringAddrPort (),
549
+ dest .ToStringAddrPort (),
544
550
NetworkErrorString (WSAGetLastError ()));
545
- return false ;
551
+ return {} ;
546
552
} else if (occurred == 0 ) {
547
- LogPrint (BCLog::NET, " connection attempt to %s timed out\n " , addrConnect .ToStringAddrPort ());
548
- return false ;
553
+ LogPrint (BCLog::NET, " connection attempt to %s timed out\n " , dest .ToStringAddrPort ());
554
+ return {} ;
549
555
}
550
556
551
557
// Even if the wait was successful, the connect might not
@@ -554,17 +560,17 @@ bool ConnectSocketDirectly(const CService &addrConnect, const Sock& sock, int nT
554
560
// sockerr here.
555
561
int sockerr;
556
562
socklen_t sockerr_len = sizeof (sockerr);
557
- if (sock. GetSockOpt (SOL_SOCKET, SO_ERROR, (sockopt_arg_type)&sockerr, &sockerr_len) ==
563
+ if (sock-> GetSockOpt (SOL_SOCKET, SO_ERROR, (sockopt_arg_type)&sockerr, &sockerr_len) ==
558
564
SOCKET_ERROR) {
559
- LogPrintf (" getsockopt() for %s failed: %s\n " , addrConnect .ToStringAddrPort (), NetworkErrorString (WSAGetLastError ()));
560
- return false ;
565
+ LogPrintf (" getsockopt() for %s failed: %s\n " , dest .ToStringAddrPort (), NetworkErrorString (WSAGetLastError ()));
566
+ return {} ;
561
567
}
562
568
if (sockerr != 0 ) {
563
569
LogConnectFailure (manual_connection,
564
570
" connect() to %s failed after wait: %s" ,
565
- addrConnect .ToStringAddrPort (),
571
+ dest .ToStringAddrPort (),
566
572
NetworkErrorString (sockerr));
567
- return false ;
573
+ return {} ;
568
574
}
569
575
}
570
576
#ifdef WIN32
@@ -573,11 +579,11 @@ bool ConnectSocketDirectly(const CService &addrConnect, const Sock& sock, int nT
573
579
else
574
580
#endif
575
581
{
576
- LogConnectFailure (manual_connection, " connect() to %s failed: %s" , addrConnect .ToStringAddrPort (), NetworkErrorString (WSAGetLastError ()));
577
- return false ;
582
+ LogConnectFailure (manual_connection, " connect() to %s failed: %s" , dest .ToStringAddrPort (), NetworkErrorString (WSAGetLastError ()));
583
+ return {} ;
578
584
}
579
585
}
580
- return true ;
586
+ return sock ;
581
587
}
582
588
583
589
bool SetProxy (enum Network net, const Proxy &addrProxy) {
@@ -628,27 +634,32 @@ bool IsProxy(const CNetAddr &addr) {
628
634
return false ;
629
635
}
630
636
631
- bool ConnectThroughProxy (const Proxy& proxy, const std::string& strDest, uint16_t port, const Sock& sock, int nTimeout, bool & outProxyConnectionFailed)
637
+ std::unique_ptr<Sock> ConnectThroughProxy (const Proxy& proxy,
638
+ const std::string& dest,
639
+ uint16_t port,
640
+ bool & proxy_connection_failed)
632
641
{
633
642
// first connect to proxy server
634
- if (!ConnectSocketDirectly (proxy.proxy , sock, nTimeout, true )) {
635
- outProxyConnectionFailed = true ;
636
- return false ;
643
+ auto sock = ConnectDirectly (proxy.proxy , /* manual_connection=*/ true );
644
+ if (!sock) {
645
+ proxy_connection_failed = true ;
646
+ return {};
637
647
}
648
+
638
649
// do socks negotiation
639
650
if (proxy.randomize_credentials ) {
640
651
ProxyCredentials random_auth;
641
652
static std::atomic_int counter (0 );
642
653
random_auth.username = random_auth.password = strprintf (" %i" , counter++);
643
- if (!Socks5 (strDest , port, &random_auth, sock)) {
644
- return false ;
654
+ if (!Socks5 (dest , port, &random_auth, * sock)) {
655
+ return {} ;
645
656
}
646
657
} else {
647
- if (!Socks5 (strDest , port, nullptr , sock)) {
648
- return false ;
658
+ if (!Socks5 (dest , port, nullptr , * sock)) {
659
+ return {} ;
649
660
}
650
661
}
651
- return true ;
662
+ return sock ;
652
663
}
653
664
654
665
CSubNet LookupSubNet (const std::string& subnet_str)
0 commit comments