void TSockSys::Connect(const uint64& SockId, const PSockHost& SockHost, const int& PortN) { // make sure it's a valid socket IAssert(IsSock(SockId)); uv_tcp_t* SockHnd = SockIdToHndH.GetDat(SockId); // make sure we got a valid socket host IAssert(SockHost->IsOk()); // get connection handle uv_connect_t* ConnectHnd = (uv_connect_t*)malloc(sizeof(uv_connect_t)); // special handling for v4 and v6 int ResCd = 0; if (SockHost->IsIpv4()) { // get address struct sockaddr_in Addr = uv_ip4_addr(SockHost->GetIpNum().CStr(), PortN); // establish connection ResCd = uv_tcp_connect(ConnectHnd, SockHnd, Addr, TSockSys::OnConnect); } else if (SockHost->IsIpv6()) { // get address struct sockaddr_in6 Addr = uv_ip6_addr(SockHost->GetIpNum().CStr(), PortN); // establish connection ResCd = uv_tcp_connect6(ConnectHnd, SockHnd, Addr, TSockSys::OnConnect); } // check for errors if (ResCd != 0) { // cleanup first free(SockHnd); // and throw exception throw TExcept::New("SockSys.Connect: Error establishing socket connection: " + SockSys.GetLastErr()); } }
void TNntpSockEvent::OnGetHost(const PSockHost& _SockHost){ if (_SockHost->IsOk()){ SockHost=_SockHost; SockMOut.Clr(); Sock=PSock(new TSock(this)); Sock->Connect(SockHost, NntpClt->GetSrvPortN()); Sock->PutTimeOut(10*1000); } else if (_SockHost->GetStatus()==shsTryAgain){ GetHostTrys++; if (GetHostTrys<MxGetHostTrys){ TSockHost::GetAsyncSockHost(NntpClt->GetSrvHostNm(), this); } else { OnNntpError("Can't get host info"); } } else { OnNntpError("Invalid Host"); } }
void TCltSockSockEvent::OnGetHost(const PSockHost& SockHost){ IAssert(Mode==csmGetingHost); if (SockHost->IsOk()){ Mode=csmConnecting; CltSock->Sock=PSock(new TSock(this)); CltSock->Sock->Connect(SockHost, CltSock->GetPortN()); CltSock->Sock->PutTimeOut(1000); } else if (SockHost->GetStatus()==shsTryAgain){ GetHostTrys++; if (GetHostTrys<MxGetHostTrys){ TSockHost::GetAsyncSockHost(CltSock->GetHostNm(), this); } else { OnError(-1, "Can't get host info"); } } else { OnError(-1, "Invalid host"); } }
void TWebPgFetchEvent::OnGetHost(const PSockHost& SockHost) { if (SockHost->IsOk()){ UrlStrV.Add(CurUrl->GetUrlStr()); OppSockClosed=false; SockMem.Clr(); Sock=TSock::New(this); int PortN; if (ProxyStr.Empty()){ PortN=CurUrl->GetPortN(); } else { TStr ProxyHostNm; TStr PortNStr; ProxyStr.SplitOnCh(ProxyHostNm, ':', PortNStr); PortN=PortNStr.GetInt(80); } Sock->PutTimeOut(TimeOutMSecs); Sock->Connect(SockHost, PortN); } else { OnFetchError("Invalid Host"); } }