www.pudn.com > acdx.rar > ServerSocketHandler.h


#if !defined(ServerSocketHandler_H) 
#define ServerSocketHandler_H 
 
 
 
#include "ServerSocket.h" 
#include "SocketHandler.h" 
 
#include  
using 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 << "Joe Blow" << endl; 
strm << "" << id << "" << 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); 
 
 
*/ 
 
 
 
 
#endif