www.pudn.com > acdx.rar > ServerSocketHandler.h
#if !defined(ServerSocketHandler_H) #define ServerSocketHandler_H #include "ServerSocket.h" #include "SocketHandler.h" #includeusing namespace std; //////////////////////////////////////////////////////////////////////////////// // ServerSocketHandler // // Purpose: handles basics of server socket connections //##ModelId=424BB64202E8 typedef list
SocketHandlers; //##ModelId=424BB64202F6 typedef SocketHandlers::iterator itrSocketHandlers; //##ModelId=424BB6420306 typedef SocketHandlers::reverse_iterator revItrSocketHandlers; //##ModelId=424BB6420315 class ServerSocketHandler : public SocketHandler { //##ModelId=424BB6420325 CreateSocketHandler & _createSocket; // creates socket handler //##ModelId=424BB6420335 SocketHandlers _handlers; // active socket handlers public: //##ModelId=424BB6420339 ServerSocketHandler ( ServerSocket & sock, CreateSocketHandler & createSocket ) : SocketHandler( (Socket &) sock ), _createSocket(createSocket), _handlers() {} // get server socket //##ModelId=424BB6420345 ServerSocket & getServerSocket () { return (ServerSocket &) SocketHandler::getSocket(); } // create/release //##ModelId=424BB6420346 bool create () { if ( !SocketHandler::create() ) return false; return true; } //##ModelId=424BB6420353 void release () { if ( _handlers.empty() ) return; // release any socket handlers for ( itrSocketHandlers itr = _handlers.begin(); itr != _handlers.end(); itr++ ) { // get handler SocketHandler * handler = *itr; // do cleanup and get rid of it if ( handler ) { handler->release(); delete handler; } } // cleanup list _handlers.clear(); } // check handlers to see if any are not active //##ModelId=424BB6420354 void cleanup () { if ( _handlers.empty() ) return; // release any socket handlers itrSocketHandlers itr = _handlers.begin(); while ( itr != _handlers.end() ) { // get handler SocketHandler * handler = *itr; // do cleanup if needed if ( handler && !handler->isConnected() ) { // get rid of it handler->release(); delete handler; // remove this one goto next itr = _handlers.erase(itr); } else { itr++; } } } // socket event methods //##ModelId=424BB6420355 virtual bool onConnect ( int error ) { // get server socket ServerSocket & server = getServerSocket(); // get socket, accept and create SocketHandler * handler = _createSocket.createHandler(); if ( !handler ) return false; // add to handlers _handlers.push_back(handler); // do accept on socket Socket & sock = (*handler).getSocket(); if ( !server.accept( sock ) ) { return false; } // finish create handler->create(); return true; } // run time processing //##ModelId=424BB6420364 long run () { // get server socket ServerSocket & server = getServerSocket(); // if listen fails if ( !server.listen() ) return -1; // set socket to non blocking if ( !server.setSocketNonBlocking() ) return -1; return process(server); } // idle processing //##ModelId=424BB6420365 void idle () { // do cleanup during idle processing cleanup(); } }; /* // set buffer stringstream strm; strm << " " << endl; strm << " " << endl; id++; // not implemented at this time *this << strm.str(); char buffer[1024]; long noRead = recieve( buffer, 1024 ); long idIn = (long) atoi(buffer); */ #endifJoe Blow " << endl; strm << "" << id << " " << endl; strm << "