📄 conn.cpp
字号:
} // get local host name struct hostent* hptr; theErr = get_host_by_name(pHostname, hptr); if (FAILED(theErr)) { goto bail; } HX_ASSERT(hptr);#ifndef _MACINTOSH if (hptr->h_addrtype == AF_INET) { // get # of interfaces UINT32 ulIFCount = 0; for (pptr = hptr->h_addr_list; *pptr != NULL; pptr++) { ulIFCount++; } if (ulIFCount > ulNumInterfaces) { // tell the user how many it needs. ulNumInterfaces = ulIFCount; theErr = HXR_BUFFERTOOSMALL; goto bail; } ulNumInterfaces= 0; for (pptr = hptr->h_addr_list; *pptr != NULL; pptr++) { pulInterfaces[ulNumInterfaces++] = DwToHost(*(UINT32*)*pptr); } HX_ASSERT(ulNumInterfaces == ulIFCount); theErr = HXR_OK; } else { theErr = HXR_UNEXPECTED; }#endifbail: return theErr; }#if defined(HELIX_FEATURE_SECURECONN)CHXMapPtrToPtr secureconnhelper::zm_ConnMap;// xxxbobclark yeesh, why this is required I'm still working on.// Yuck nonetheless.void WasteTime(){#ifdef _MACINTOSH ULONG32 startTix = HX_GET_TICKCOUNT(); while (CALCULATE_ELAPSED_TICKS(startTix, HX_GET_TICKCOUNT()) < 200) {// EventRecord er;// ::EventAvail(everyEvent, &er); }#endif}conn*secureconnhelper::GetConn(LONG32 fakeFD){ conn* pConn = (conn*)zm_ConnMap[(void*)fakeFD]; HX_ASSERT(pConn != NULL); return pConn;}voidsecureconnhelper::SetConn(LONG32 fakeFD, conn* pConn){ HX_ASSERT(zm_ConnMap[(void*)fakeFD] == NULL); zm_ConnMap[(void*)fakeFD] = pConn;}long secureconnhelper::readCallback(LONG32 fakeFD, void* buff, LONG32 len){ conn* pConn = GetConn(fakeFD); HX_RESULT result = HXR_FAIL; if (pConn) { UINT16 bytes = (UINT16) len; result = pConn->read(buff, &bytes); WasteTime(); if (result == HXR_OK) { return bytes; } } return -1;}long secureconnhelper::writeCallback(LONG32 fakeFD, void* buff, LONG32 len){ conn* pConn = GetConn(fakeFD); HX_RESULT result = HXR_FAIL; if (pConn) { UINT16 bytes = (UINT16) len; result = pConn->write(buff, &bytes); WasteTime(); if (result == HXR_OK) { return bytes; } } return -1;}void secureconnhelper::closeCallback(LONG32 fakeFD){ conn* pConn = GetConn(fakeFD); if (pConn) { pConn->done(); }}LONG32 secureconn::zm_Count = 0;secureconn::secureconn(IHXSSL* pHXSSL) : m_lRefCount(0) , m_pActualConn(0) , m_FakeFD(-1) , m_pHXSSL(NULL){ m_pActualConn = conn::new_socket(HX_TCP_SOCKET); m_FakeFD = ++zm_Count; secureconnhelper::SetConn(m_FakeFD, m_pActualConn); m_pHXSSL = pHXSSL; HX_ASSERT(m_pHXSSL != NULL); m_pHXSSL->AddRef(); m_pHXSSL->SetCallbacks((void*)secureconnhelper::readCallback, (void*)secureconnhelper::writeCallback, (void*)secureconnhelper::closeCallback); m_pHXSSL->Initialize();}secureconn::~secureconn(){ HX_ASSERT(m_pActualConn != NULL); m_pHXSSL->Shutdown(); HX_RELEASE(m_pHXSSL); if (m_pActualConn) { m_pActualConn->Release(); m_pActualConn = NULL; }}ULONG32 secureconn::AddRef(){ return InterlockedIncrement(&m_lRefCount);}ULONG32 secureconn::Release(){ if (InterlockedDecrement(&m_lRefCount) > 0) { return m_lRefCount; } delete this; return 0;}HX_RESULTsecureconn::connect(const char* host, UINT16 port, UINT16 blocking, ULONG32 ulPlatform){ HX_ASSERT(m_pActualConn != NULL); HX_ASSERT(m_pHXSSL != NULL); HX_RESULT result = m_pActualConn->connect(host, port, blocking, ulPlatform); WasteTime(); if (result == HXR_OK) { result = m_pHXSSL->PostConnect(m_FakeFD); } return result;}HX_RESULTsecureconn::read(void* buf, UINT16* size){ HX_ASSERT(m_pActualConn != NULL); HX_ASSERT(m_pHXSSL != NULL); LONG32 len = *size; len = m_pHXSSL->Read(m_FakeFD, buf, len); if (len == -1) return HXR_FAIL; *size = (UINT16) len; return HXR_OK;}HX_RESULTsecureconn::write(void* buf, UINT16* size){ HX_ASSERT(m_pActualConn != NULL); HX_ASSERT(m_pHXSSL != NULL); LONG32 len = *size; len = m_pHXSSL->Write(m_FakeFD, buf, len); if (len == -1) return HXR_FAIL; *size = (UINT16) len; return HXR_OK;}HX_RESULT secureconn::blocking(){ HX_ASSERT(m_pActualConn != NULL); return m_pActualConn->blocking();}HX_RESULT secureconn::nonblocking(){ HX_ASSERT(m_pActualConn != NULL); return m_pActualConn->nonblocking();}HX_RESULT secureconn::readfrom(REF(IHXBuffer*) pBuffer, REF(UINT32) ulAddress, REF(UINT16) ulPort){ HX_ASSERT(m_pActualConn != NULL); return m_pActualConn->readfrom(pBuffer, ulAddress, ulPort);}HX_RESULT secureconn::writeto(void *buf, UINT16 *len, ULONG32 addr, UINT16 port){ HX_ASSERT(m_pActualConn != NULL); return m_pActualConn->writeto(buf, len, addr, port);}ULONG32 secureconn::get_addr(){ HX_ASSERT(m_pActualConn != NULL); return m_pActualConn->get_addr();}UINT16 secureconn::get_local_port(){ HX_ASSERT(m_pActualConn != NULL); return m_pActualConn->get_local_port();}HX_RESULTsecureconn::dns_find_ip_addr(const char * host, UINT16 blocking){ HX_ASSERT(m_pActualConn != NULL); return m_pActualConn->dns_find_ip_addr(host, blocking);}BOOLsecureconn::dns_ip_addr_found(BOOL * valid, ULONG32 *addr){ HX_ASSERT(m_pActualConn != NULL); return m_pActualConn->dns_ip_addr_found(valid, addr);}voidsecureconn::done(){ HX_ASSERT(m_pActualConn != NULL); m_pActualConn->done();}HX_RESULTsecureconn::init(UINT32 local_addr, UINT16 port, UINT16 blocking){ HX_ASSERT(m_pActualConn != NULL); return m_pActualConn->init(local_addr, port, blocking);}HX_RESULTsecureconn::listen(ULONG32 ulLocalAddr, UINT16 port, UINT16 backlog, UINT16 blocking, ULONG32 ulPlatform){ HX_ASSERT(m_pActualConn != NULL); return m_pActualConn->listen(ulLocalAddr, port, backlog, blocking, ulPlatform);}HX_RESULTsecureconn::join_multicast_group(ULONG32 addr, ULONG32 if_addr){ HX_ASSERT(m_pActualConn != NULL); return m_pActualConn->join_multicast_group(addr, if_addr);}HX_RESULTsecureconn::leave_multicast_group(ULONG32 addr, ULONG32 if_addr){ HX_ASSERT(m_pActualConn != NULL); return m_pActualConn->leave_multicast_group(addr, if_addr);}HX_RESULTsecureconn::set_broadcast(BOOL enable){ HX_ASSERT(m_pActualConn != NULL); return m_pActualConn->set_broadcast(enable);}HX_RESULTsecureconn::set_multicast_if(UINT32 ulInterface){ HX_ASSERT(m_pActualConn != NULL); return m_pActualConn->set_multicast_if(ulInterface);}HX_RESULTsecureconn::last_error(){ HX_ASSERT(m_pActualConn != NULL); return m_pActualConn->last_error();}#ifdef _MACINTOSHHX_RESULTsecureconn::GetEndpoint(REF(void*) pRef){ HX_ASSERT(m_pActualConn != NULL); return m_pActualConn->GetEndpoint(pRef);}HX_RESULTsecureconn::SetupEndpoint(BOOL bWait){ HX_ASSERT(m_pActualConn != NULL); return m_pActualConn->SetupEndpoint(bWait);}#endifvoidsecureconn::set_callback(HXAsyncNetCallback* pCallback){ HX_ASSERT(m_pActualConn != NULL); m_pActualConn->set_callback(pCallback);}UINT16secureconn::connection_open(){ HX_ASSERT(m_pActualConn != NULL); return m_pActualConn->connection_open();}intsecureconn::get_sock(){ HX_ASSERT(m_pActualConn != NULL); return m_pActualConn->get_sock();}voidsecureconn::set_sock(int theSock){ HX_ASSERT(m_pActualConn != NULL); m_pActualConn->set_sock(theSock);}BOOLsecureconn::set_receive_buf_size(int DesiredSize){ HX_ASSERT(m_pActualConn != NULL); return m_pActualConn->set_receive_buf_size(DesiredSize);}HX_RESULTsecureconn::reuse_addr(BOOL enable){ HX_ASSERT(m_pActualConn != NULL); return m_pActualConn->reuse_addr(enable);}HX_RESULTsecureconn::reuse_port(BOOL enable){ HX_ASSERT(m_pActualConn != NULL); return m_pActualConn->reuse_port(enable);}#endif /* HELIX_FEATURE_SECURECONN */#ifdef TESTING#include "conn.h"int opt_debug = 0xff;int main( int argc, char **argv ){ conn *m_conn = 0; HX_RESULT theErr = HXR_OK; m_conn = conn::new_socket( HX_TCP_SOCKET ); if ( m_conn ) { // XXXAAK -- local addr binding stuff theErr = m_conn->init( INADDR_ANY, argc > 2 ? atoi(argv[2]) : 7071, 1); if ( !theErr ) { theErr = m_conn->connect( argc > 1 ? argv[1] : "localhost", argc > 2 ? atoi(argv[2]) : 7071, 1); printf("connect(): %s, port: %d, theErr: %d, errno: %d\n", argc > 1 ? argv[1] : "localhost", argc > 2 ? atoi(argv[2]) : 7071, theErr, errno ); } else printf("Couldn't init port: %d, theErr: %d\n", argc > 2 ? atoi(argv[2]) : 7071, theErr); } else printf("Couldn't create a new TCP socket!\n"); exit(0);}#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -