MCPcopy Create free account
hub / github.com/BTCGPU/BTCGPU / ConnectSocketDirectly

Function ConnectSocketDirectly

src/netbase.cpp:484–540  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

482}
483
484bool ConnectSocketDirectly(const CService &addrConnect, const SOCKET& hSocket, int nTimeout, bool manual_connection)
485{
486 struct sockaddr_storage sockaddr;
487 socklen_t len = sizeof(sockaddr);
488 if (hSocket == INVALID_SOCKET) {
489 LogPrintf("Cannot connect to %s: invalid socket\n", addrConnect.ToString());
490 return false;
491 }
492 if (!addrConnect.GetSockAddr((struct sockaddr*)&sockaddr, &len)) {
493 LogPrintf("Cannot connect to %s: unsupported network\n", addrConnect.ToString());
494 return false;
495 }
496 if (connect(hSocket, (struct sockaddr*)&sockaddr, len) == SOCKET_ERROR)
497 {
498 int nErr = WSAGetLastError();
499 // WSAEINVAL is here because some legacy version of winsock uses it
500 if (nErr == WSAEINPROGRESS || nErr == WSAEWOULDBLOCK || nErr == WSAEINVAL)
501 {
502 struct timeval timeout = MillisToTimeval(nTimeout);
503 fd_set fdset;
504 FD_ZERO(&fdset);
505 FD_SET(hSocket, &fdset);
506 int nRet = select(hSocket + 1, nullptr, &fdset, nullptr, &timeout);
507 if (nRet == 0)
508 {
509 LogPrint(BCLog::NET, "connection to %s timeout\n", addrConnect.ToString());
510 return false;
511 }
512 if (nRet == SOCKET_ERROR)
513 {
514 LogPrintf("select() for %s failed: %s\n", addrConnect.ToString(), NetworkErrorString(WSAGetLastError()));
515 return false;
516 }
517 socklen_t nRetSize = sizeof(nRet);
518 if (getsockopt(hSocket, SOL_SOCKET, SO_ERROR, (sockopt_arg_type)&nRet, &nRetSize) == SOCKET_ERROR)
519 {
520 LogPrintf("getsockopt() for %s failed: %s\n", addrConnect.ToString(), NetworkErrorString(WSAGetLastError()));
521 return false;
522 }
523 if (nRet != 0)
524 {
525 LogConnectFailure(manual_connection, "connect() to %s failed after select(): %s", addrConnect.ToString(), NetworkErrorString(nRet));
526 return false;
527 }
528 }
529#ifdef WIN32
530 else if (WSAGetLastError() != WSAEISCONN)
531#else
532 else
533#endif
534 {
535 LogConnectFailure(manual_connection, "connect() to %s failed: %s", addrConnect.ToString(), NetworkErrorString(WSAGetLastError()));
536 return false;
537 }
538 }
539 return true;
540}
541

Callers 2

ConnectThroughProxyFunction · 0.85
ConnectNodeMethod · 0.85

Calls 5

MillisToTimevalFunction · 0.85
NetworkErrorStringFunction · 0.85
LogConnectFailureFunction · 0.85
GetSockAddrMethod · 0.80
ToStringMethod · 0.45

Tested by

no test coverage detected