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 TSockSys::OnGetHost(uv_getaddrinfo_t* RequestHnd, int Status, struct addrinfo* AddrInfo) { // get SockHost PSockHost SockHost; if (SockSys.HndToSockHostH.IsKey((uint64)RequestHnd)) { SockHost = SockSys.HndToSockHostH.GetDat((uint64)RequestHnd); SockSys.HndToSockHostH.DelKey((uint64)RequestHnd); } else { free(RequestHnd); uv_freeaddrinfo(AddrInfo); SaveToErrLog("SockSys.OnGetHost: unkown RequestId"); return; } // get SockEvent PSockEvent SockEvent; if (SockHost->IsSockEvent()) { SockEvent = SockHost->GetSockEvent(); } else { free(RequestHnd); uv_freeaddrinfo(AddrInfo); SaveToErrLog("SockSys.OnGetHost: SockHost without SockEvent"); return; } // parse results if (Status == 0) { SockHost->Status = shsOk; // temporary buffer for storing IPs char _addr[64] = {'\0'}; // iterate over all the resolved IPs struct addrinfo* AddrInfoIter = AddrInfo; while (AddrInfoIter != NULL) { //if (AddrInfoIter->ai_family //AF_INET6 // get IP as string if (AddrInfoIter->ai_family == AF_INET) { uv_ip4_name((struct sockaddr_in*)AddrInfoIter->ai_addr, _addr, sizeof(_addr)); } else if (AddrInfoIter->ai_family == AF_INET6) { uv_ip6_name((struct sockaddr_in6*)AddrInfoIter->ai_addr, _addr, sizeof(_addr)); } TStr IpNum(_addr); // add to SockHost SockHost->AddIpNum(IpNum); // go to the next IP on the list AddrInfoIter = AddrInfoIter->ai_next; } } else if (Status == -1) { // something went wrong SockHost->Status = shsError; SockHost->ErrMsg = "SockSys.OnGetHost: " + SockSys.GetLastErr(); } else { // unkown status SockHost->Status = shsError; SockHost->ErrMsg = TStr::Fmt("SockSys.OnGetHost: unkown status %d", Status); } // clean up free(RequestHnd); uv_freeaddrinfo(AddrInfo); // callback SockEvent->OnGetHost(SockHost); }
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"); } }
void CloseConn(){SockHost.Clr(); Sock.Clr();}