@@ -517,18 +517,24 @@ static void LogConnectFailure(bool manual_connection, const char* fmt, const Arg
517517 }
518518}
519519
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)
521521{
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+
522528 // Create a sockaddr from the specified service.
523529 struct sockaddr_storage sockaddr;
524530 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 {} ;
528534 }
529535
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) {
532538 int nErr = WSAGetLastError ();
533539 // WSAEINVAL is here because some legacy version of winsock uses it
534540 if (nErr == WSAEINPROGRESS || nErr == WSAEWOULDBLOCK || nErr == WSAEINVAL)
@@ -538,14 +544,14 @@ bool ConnectSocketDirectly(const CService &addrConnect, const Sock& sock, int nT
538544 // synchronously to check for successful connection with a timeout.
539545 const Sock::Event requested = Sock::RECV | Sock::SEND;
540546 Sock::Event occurred;
541- if (!sock. Wait (std::chrono::milliseconds{nTimeout }, requested, &occurred)) {
547+ if (!sock-> Wait (std::chrono::milliseconds{nConnectTimeout }, requested, &occurred)) {
542548 LogPrintf (" wait for connect to %s failed: %s\n " ,
543- addrConnect .ToStringAddrPort (),
549+ dest .ToStringAddrPort (),
544550 NetworkErrorString (WSAGetLastError ()));
545- return false ;
551+ return {} ;
546552 } 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 {} ;
549555 }
550556
551557 // Even if the wait was successful, the connect might not
@@ -554,17 +560,17 @@ bool ConnectSocketDirectly(const CService &addrConnect, const Sock& sock, int nT
554560 // sockerr here.
555561 int sockerr;
556562 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) ==
558564 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 {} ;
561567 }
562568 if (sockerr != 0 ) {
563569 LogConnectFailure (manual_connection,
564570 " connect() to %s failed after wait: %s" ,
565- addrConnect .ToStringAddrPort (),
571+ dest .ToStringAddrPort (),
566572 NetworkErrorString (sockerr));
567- return false ;
573+ return {} ;
568574 }
569575 }
570576#ifdef WIN32
@@ -573,11 +579,11 @@ bool ConnectSocketDirectly(const CService &addrConnect, const Sock& sock, int nT
573579 else
574580#endif
575581 {
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 {} ;
578584 }
579585 }
580- return true ;
586+ return sock ;
581587}
582588
583589bool SetProxy (enum Network net, const Proxy &addrProxy) {
@@ -628,27 +634,32 @@ bool IsProxy(const CNetAddr &addr) {
628634 return false ;
629635}
630636
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)
632641{
633642 // 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 {};
637647 }
648+
638649 // do socks negotiation
639650 if (proxy.randomize_credentials ) {
640651 ProxyCredentials random_auth;
641652 static std::atomic_int counter (0 );
642653 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 {} ;
645656 }
646657 } else {
647- if (!Socks5 (strDest , port, nullptr , sock)) {
648- return false ;
658+ if (!Socks5 (dest , port, nullptr , * sock)) {
659+ return {} ;
649660 }
650661 }
651- return true ;
662+ return sock ;
652663}
653664
654665CSubNet LookupSubNet (const std::string& subnet_str)
0 commit comments