#include #include #include extern bool running; GenericServer::GenericServer(void) : mIsRunning(TRUE) { } GenericServer::~GenericServer() { message("[GenericServer::~GenericServer]Server is destructing..."); } void GenericServer::close(void) { mIsRunning=FALSE; } WORD GenericServer::listen(const String &hostName,short portNum) { HostEnt hostEntry; ServEnt serverEntry; String stringData; SystemTime systemTime; DWORD elapsedTime; message(String("[GenericServer::listen]trying host'")+hostName+String("'...")); if(!mWSASystem.isInitialized()){message("[GenericServer::listen]WINSOCK initialization failure.");return FALSE;} InternetAddress internetAddress(hostName); if(!internetAddress.isZero()){if(!hostEntry.hostByAddress(internetAddress)){message(String("[GenericServer::listen]no DNS entry for ")+hostName);return FALSE;}} else if(!hostEntry.hostByName(hostName)){message(String("[GenericServer::listen]no DNS entry for ")+hostName);return FALSE;} message(String("[GenericServer::listen]connect...")+String("'")+hostEntry.hostName()+String("' (")+(String)(hostEntry.addresses())[0]+String(")")); mInternetSocketAddress.internetAddress((hostEntry.addresses())[0]); mInternetSocketAddress.family(PF_INET); mInternetSocketAddress.port(portNum); if(!mGenericControl.create()){message("[GenericServer::listen]socket initialization failure.");return FALSE;} mGenericControl.reuseAddress(); if(!mGenericControl.bind(mInternetSocketAddress)){message("[GenericServer::listen]bind failed");return FALSE;} while(mIsRunning&&running) { SmartPointer socketControl; socketControl=::new Socket(); // socketControl.disposition(PointerDisposition::Assume); socketControl.disposition(PointerDisposition::Delete); INETSocketAddress internetSocketAddress; message(String("[GenericServer::listen]host='")+(hostEntry.addresses())[0]+String("' port=")+String().fromInt(portNum)); String strLocalHost((String)mInternetSocketAddress.internetAddress()); message(String("[GenericServer::listen]local address is ")+strLocalHost); if(!mGenericControl.listen()){message("[GenericServer::listen]listen failed");return FALSE;} message("[GenericServer::listen]waiting for connection..."); if(!mGenericControl.accept(*socketControl,internetSocketAddress)){message("[GenericServer::listen]accept returned FALSE;");return FALSE;} // socketControl->setLinger(0); // socketControl->bind(internetSocketAddress); systemTime.refresh(); message(String("[GenericServer::listen]service started from ")+internetSocketAddress.internetAddress().toString()+String(" on ")+systemTime.toString()); elapsedTime=::GetTickCount(); acceptHandler(socketControl); socketControl->destroy(); socketControl.destroy(); elapsedTime=::GetTickCount()-elapsedTime; message(String("[GenericServer::listen]service took ")+String().fromInt(elapsedTime)+String("(ms)")); } mGenericControl.destroy(); message("[GenericServer::listen]terminating connection"); return TRUE; } // virtuals void GenericServer::message(const String &message) { ::OutputDebugString(message+String("\n")); } void GenericServer::message(Block &msgData) { for(int msgIndex=0;msgIndex &socket) { SmartPointer socketControl; socketControl=socket; socketControl.disposition(PointerDisposition::Delete); String acceptString("[GenericServer::acceptHandler]200 GenericServer::acceptHandler accepting connection."); socketControl->send(acceptString); message(acceptString); return; }