⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 serversockethandler.h

📁 该代码是将MSDN中的httpsvr MFC代码移植到STL。含有VC完整应用程序代码。
💻 H
字号:
#if !defined(ServerSocketHandler_H)
#define ServerSocketHandler_H



#include "ServerSocket.h"
#include "SocketHandler.h"

#include <list>
using namespace std;


////////////////////////////////////////////////////////////////////////////////
// ServerSocketHandler
//
// Purpose: handles basics of server socket connections

typedef list<SocketHandler *>				SocketHandlers;
typedef SocketHandlers::iterator			itrSocketHandlers;
typedef SocketHandlers::reverse_iterator	revItrSocketHandlers;



class ServerSocketHandler :
	public SocketHandler
{
	CreateSocketHandler &		_createSocket;	// creates socket handler
	SocketHandlers				_handlers;		// active socket handlers


public:

	ServerSocketHandler ( ServerSocket & sock, CreateSocketHandler & createSocket ) :
	    SocketHandler( (Socket &) sock ),
		_createSocket(createSocket),
		_handlers()
	{}


	// get server socket
	ServerSocket & getServerSocket ()
	{
		return (ServerSocket &) SocketHandler::getSocket();
	}

	// create/release
	bool create ()
	{
		if ( !SocketHandler::create() )
			return false;

		return true;
	}

	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
	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
	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
	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
	void idle ()
	{
		// do cleanup during idle processing
		cleanup();
	}
	

};


/*
// set buffer
stringstream strm;
strm << "<Contact>" << endl;
strm << "<name>Joe Blow</name>" << endl;
strm << "<id>" << id << "</id>" << endl;
strm << "</Contact>" << endl;

id++;

// not implemented at this time
*this << strm.str();

char buffer[1024];
long noRead = recieve( buffer, 1024 );

long idIn = (long) atoi(buffer);


*/




#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -