Return Type | Function name | Arguments |
---|---|---|
hzEcode | hzIpServer::ProxyTo | (hzIpConnex*,unsigned int,) |
Declared in file: hzIpServer.h
Defined in file : hzIpServer.cpp
Function Logic:
Function body:
hzEcode hzIpServer::ProxyTo (hzIpConnex* pConn, unsigned int nPort) { _hzfunc("hzIpServer::ProxyTo") ; SOCKADDRIN svrAddr ; HOSTENT* pHost ; struct epoll_event epEventNew ; struct timeval tv ; hzIpConnex* pExt ; hzXDate now ; hzString hostname ; int32_t nSock ; hzEcode rc ; if (!pConn) return hzerr(E_ARGUMENT, "No connection") ; if (pConn->m_pProxy) pExt = pConn->m_pProxy ; else { hostname = "127.0.0.1" ; if (!(pHost = gethostbyname(*hostname))) { threadLog("Unknown Host [%s]\n", *hostname) ; return E_HOSTFAIL ; } memset(&svrAddr, 0,sizeof(svrAddr)) ; svrAddr.sin_family = AF_INET ; memcpy(&svrAddr.sin_addr, pHost->h_addr, pHost->h_length) ; svrAddr.sin_port = htons(nPort) ; if ((nSock = socket(AF_INET, SOCK_STREAM, 0))< 0) return hzerr(E_NOSOCKET, "Could not create socket (returns %d, errno %d)", nSock, errno) ; if (connect(nSock, (struct sockaddr *) &svrAddr, sizeof(svrAddr)) < 0) return hzerr(E_HOSTFAIL, "Could not connect to %s on port %d (errno=%d)", *hostname, nPort, errno) ; rc = _nonblock(nSock) ; if (rc != E_OK) return rc ; tv.tv_sec = 10; tv.tv_usec = 0; if (setsockopt(nSock, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv)) < 0) return E_HOSTFAIL ; epEventNew.data.fd = nSock ; epEventNew.events = EPOLLIN | EPOLLOUT ; if (epoll_ctl(s_epollSocket, EPOLL_CTL_ADD, nSock, &epEventNew) < 0) { m_pLog->Log("Loop %u: EPOLL ERROR: Could not add client connection handler on sock %d/%d. Error=%s\n", m_nLoop, nSock, pConn->CliPort(), strerror(errno)) ; if (close(nSock) < 0) m_pLog->Log("NOTE: Could not close socket %d after memory allocation failure. errno=%d\n", nSock, errno) ; m_bShutdown = true ; return E_HOSTFAIL ; } pExt = pConn->m_pProxy = new hzIpConnex(m_pLog) ; pExt->m_pProxy = pConn ; currCC[nSock] = pExt ; pExt->SetSocket(nSock) ; pExt->Oxygen() ; now.SysDateTime() ; m_pLog->Log("%s: Loop %u: NEW Proxy on socket %d/%d from %d:%d\n", now.Txt(FMT_TIME_USEC), m_nLoop, nSock, pExt->CliPort(), pConn->CliSocket(), pConn->CliPort()) ; } pExt->SendData(pConn->InputZone()) ; pConn->InputZone().Clear() ; return E_OK ; }