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

📄 sockethandler.h

📁 一个c++实现的acd的例子。 ----ACDCommandListener.cpp ---ACDCommandListenerThread.cpp ---ACDConfig.cpp ---a
💻 H
字号:
#if !defined(SocketHandler_H)
#define SocketHandler_H

#include "Socket.h"
#include "SocketNotify.h"




////////////////////////////////////////////////////////////////////////////////
// SocketHandler
//
// Purpose: handles basics of socket. provides for notification of 
//			socket events. event notification can be either passed in
//			or used as is. also provides a socket if one is not
//			passed in


//##ModelId=424BB6420046
class SocketHandler :
	public Thread,
	public SocketNotify
{
	//##ModelId=424BB6420049
	bool				_ownSocket;			// shows if delete socket on cleanup
	//##ModelId=424BB6420056
	Socket *			_socket;			// ptr to socket associated w/handler
	//##ModelId=424BB6420066
	SocketNotify *		_subscriber;		// subscriber to socket events
	//##ModelId=424BB6420075
	unsigned long		_fdEventMask;			// shows which events to fire

public:

	//##ModelId=424BB6420076
	SocketHandler () :
		Thread(),
		SocketNotify(),

		_ownSocket(false),
		_socket(NULL),
		_subscriber( (SocketNotify *) this ),
		_fdEventMask(idFdAll)

	{
		// create the socket
		createSocket();
	}

	//##ModelId=424BB6420077
	SocketHandler ( SocketNotify & subscriber ) :
		Thread(),
		SocketNotify(),

		_ownSocket(false),
		_socket(NULL),
		_subscriber( &subscriber ),
		_fdEventMask(idFdAll)

	{
		// create the socket
		createSocket();
	}


	//##ModelId=424BB6420085
	SocketHandler ( Socket & sock ) :

		Thread(),
		SocketNotify(),

		_ownSocket(false),
		_socket( &sock ),
		_subscriber( (SocketNotify *) this ),
		_fdEventMask(idFdAll)

	{}

	//##ModelId=424BB6420087
	SocketHandler ( Socket & sock, SocketNotify & subscriber ) :

		Thread(),
		SocketNotify(),

		_ownSocket(false),
		_socket(&sock),
		_subscriber(&subscriber),
		_fdEventMask(idFdAll)

	{}


	//##ModelId=424BB6420095
	virtual ~SocketHandler ()
	{
		release();
	}

	// create/release
	//##ModelId=424BB6420097
	bool create ()
	{
		if ( !Thread::create() )
			return false;

		return true;
	}

	//##ModelId=424BB64200A4
	void release ()
	{
		Thread::release();

		if ( _ownSocket && _socket )
			delete _socket;

		_socket = 0;
	}

	// socket methods
	//##ModelId=424BB64200A5
	bool createSocket ()
	{
		// create the socket
		_socket = new Socket;

		// show we own the socket
		// if created okay
		if ( _socket )
		{
			_ownSocket = true;
			return true;
		}
		else
			return false;
	}

	//##ModelId=424BB64200A6
	Socket & getSocket ()
	{
		return *_socket;
	}

	//##ModelId=424BB64200A7
	void setSocket ( Socket & socket )
	{
		_socket = &socket;
	}

	//##ModelId=424BB64200B4
	bool isValid ()
	{ 
		if ( _socket )
			return true;
		else
			return false;
	}

	//##ModelId=424BB64200B5
	bool isConnected ()
	{
		if ( _socket->isValid() )
			return true;
		else
			return false;
	}



	// subscriber methods

	//##ModelId=424BB64200B6
	long getFdEvents ()
	{
		return _fdEventMask;
	}

	//##ModelId=424BB64200C3
	void asyncSelet ( long set )
	{
		_fdEventMask = set;
	}


	//##ModelId=424BB64200C5
	SocketNotify & getSubscriber ()
	{
		return *_subscriber;
	}

	//##ModelId=424BB64200D2
	void setSubscriber ( SocketNotify & subscriber )
	{
		_subscriber = &subscriber;
	}

	// handle socket processing
	//##ModelId=424BB64200D4
	virtual
	long process ( Socket & sock )
	{
		// if no socket stop
		if ( !isValid() )
			return -1;

		// The fd sets should be zeroed out before using them to prevent errors.
		fd_set readfds, writefds, exceptfds;
		FD_ZERO(&readfds);
		FD_ZERO(&writefds);
		FD_ZERO(&exceptfds);

		// read from socket
		while ( true )
		{
			while ( true )
			{
				// show no error
				long error = 0;

				// set time to wait
				struct timeval timeout;
				timeout.tv_sec  = 1;
				timeout.tv_usec = 0;

				// setup to wait for read event
				FD_SET(sock,&readfds);
				FD_SET(sock,&writefds);
				FD_SET(sock,&exceptfds);

				int i = select(0,&readfds,&writefds,&exceptfds,&timeout);

				if ( i == SOCKET_ERROR ) 
				{
					long error = sock.getLastError();

					//fprintf(stderr,"select failed %d\n",error);
					return -1;
				}


				if ( FD_ISSET(sock,&readfds) && 
					 _fdEventMask | (idFdRead | idFdConnect) )
				{
					// got a recieve so read data
					if ( _subscriber )
					{
						long length = sock.getRecieveSize();
						if ( length == 0 )
							_subscriber->onConnect(error);
						else
							_subscriber->onReceive(error);

						Sleep(100);//  [4/5/2005] this can set cpu not under 100%  by leon change it.
					}
				}
				else if ( FD_ISSET(sock,&writefds) && _fdEventMask | idFdWrite )
				{
					// got a recieve so read data
					if ( _subscriber )
						_subscriber->onSend(error);
				}
				else if ( FD_ISSET(sock,&exceptfds)  && _fdEventMask | idFdClose )
				{
					// got a recieve so read data
					if ( _subscriber )
						_subscriber->onClose(error);
				}


				// test end event
				if ( WaitForSingleObject( getEndEvent(), 0 ) != WAIT_TIMEOUT )
					return -1;

				// do idle processing
				idle();

			}

			
		}

		return 1;

	}


	// run method implementation
	//##ModelId=424BB64200E2
	long run ()
	{
		// if no socket stop
		if ( !isValid() )
			return -1;

		// get socket
		Socket & sock = getSocket();

		// set socket to non-blocking
		if ( !sock.setSocketNonBlocking() )
			return 0;


		return process(sock);
	}

};





////////////////////////////////////////////////////////////////////////////////////
// CreateSocketHandler
// 
// Purpose:		create socket handler is a class 
//				used only to create socket handlers or their derived classes. 
//				you must implement you own


//##ModelId=424BB64200F2
class CreateSocketHandler
{
	//##ModelId=424BB64200F3
	long	i;
public:

	//##ModelId=424BB6420101
	CreateSocketHandler () 
	{
		i = -1;
	}

	//##ModelId=424BB6420102
	virtual ~CreateSocketHandler ()
	{}

	// create/release
	//##ModelId=424BB6420104
	virtual bool create ()
	{
		return true;
	}

	//##ModelId=424BB6420106
	virtual void release ()
	{}

	// responsible for create a connection
	//##ModelId=424BB6420112
	virtual 
	SocketHandler * createHandler () = 0;

};




#endif

⌨️ 快捷键说明

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