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


#if !defined(Socket_H) 
#define Socket_H 
 
#include "Lock.h" 
#include "Thread.h" 
 
#include  
#include  
using namespace std; 
 
 
// define mapping of error methods 
#if defined( _WIN32 ) 
 
#if !defined(errno) 
#define errno	WSAGetLastError 
#endif 
 
#else 
 
// win32 define ioctl for driver control 
// so redefine ioctlsocket for normal bsd 
 
#define ioctlsocket ioctl 
 
#endif 
 
//////////////////////////////////////////////////////////////////////////////// 
// Socket 
// 
// Purpose: class for reading/writing a socket 
 
 
//##ModelId=424BB6420130 
class Socket : 
	private Lock 
{ 
protected: 
 
	//##ModelId=424BB6420142 
	SOCKET			_socket; 
	//##ModelId=424BB6420150 
	SOCKADDR_IN		_addrIn; 
	//##ModelId=424BB6420154 
	long			_port; 
public: 
 
 
	//##ModelId=424BB642015F 
	Socket () : 
		_socket(INVALID_SOCKET), 
		_port() 
	{} 
 
 
	//##ModelId=424BB6420160 
	Socket ( Socket & sock ) : 
		_socket(INVALID_SOCKET), 
		_port() 
	{ 
		create( sock._socket, (SOCKADDR &) sock._addrIn );	 
	} 
 
	//##ModelId=424BB642016F 
	virtual ~Socket () 
	{ 
		close(); 
	} 
 
	// create/release 
	//##ModelId=424BB6420171 
	bool create ( SOCKET & sock, SOCKADDR & addr ) 
	{ 
		if ( sock == INVALID_SOCKET ) 
			return false; 
 
		// get new socket 
		memcpy( &_addrIn, (SOCKADDR *) &addr, sizeof(addr) ); 
		memcpy( &_socket, &sock, sizeof(_socket) ); 
 
		return true; 
	} 
 
	//##ModelId=424BB642017E 
	void release () 
	{ 
		// close socket if open 
		if ( _socket != INVALID_SOCKET ) 
		{ 
			closesocket(_socket); 
			_socket = INVALID_SOCKET; 
		} 
	} 
 
	//##ModelId=424BB642017F 
	bool isValid () 
	{ 
		if ( _socket != INVALID_SOCKET ) 
			return true; 
		else 
			return false; 
	} 
 
	//##ModelId=424BB6420180 
	long getPort () 
	{ 
		return _port; 
	} 
 
	// open methods 
	//##ModelId=424BB642018E 
	static bool initSockAddrIn ( string & host, long port, SOCKADDR_IN & addrIn ) 
	{ 
		// init socket in struct 
		memset(&addrIn,0,sizeof(addrIn)); 
 
		// set family 
		addrIn.sin_family = AF_INET; 
 
 
		if ( !host.empty() ) 
		{ 
			// retrieve the host data corresponding to the host name 
			LPHOSTENT phost; 
			if ((phost = gethostbyname(host.c_str())) != NULL)  
			{ 
				// assign the socket IP address.  
				memcpy ( (char FAR *) &(addrIn.sin_addr),  
						  phost->h_addr,  
						  phost->h_length ); 
			} 
			else 
			{ 
				// get inet address 
				addrIn.sin_addr.s_addr = inet_addr(host.c_str()); 
			} 
		} 
		else 
		{ 
			// set inet address 
			addrIn.sin_addr.s_addr = htonl(INADDR_ANY); 
		} 
 
		// set port 
		addrIn.sin_port = htons(port); 
 
		return true; 
	} 
 
	//##ModelId=424BB642019E 
	bool open ( string host, long port ) 
	{ 
		// get socket 
		_socket = socket(PF_INET,SOCK_STREAM,0); 
 
		if ( _socket == INVALID_SOCKET ) 
			return false; 
 
		// init address in 
		_port = port; 
		initSockAddrIn( host, port, _addrIn ); 
 
		// connect to socket 
		if ( connect( _socket, (const SOCKADDR *) &_addrIn, sizeof(_addrIn) ) == SOCKET_ERROR ) 
		{ 
			int error = getLastError(); 
			return false; 
		} 
		 
		 
		return true; 
	} 
 
	// close 
	//##ModelId=424BB64201A1 
	void close () 
	{ 
		// close socket if open 
		if ( _socket != INVALID_SOCKET ) 
		{ 
			closesocket(_socket); 
			_socket = INVALID_SOCKET; 
		} 
	} 
 
	//##ModelId=424BB64201AD 
	static int getLastError () 
	{ 
		return WSAGetLastError(); 
	} 
 
	//##ModelId=424BB64201AF 
	static bool init () 
	{ 
		#if defined( _WIN32 ) 
 
		// init startup 
		WSADATA WSAData; 
		WSAStartup( MAKEWORD(2,0), &WSAData ); 
 
		#endif 
 
		return true; 
	} 
 
	//##ModelId=424BB64201B1 
	long getRecieveSize () 
	{ 
		// return not of bytes waiting 
		// if fail show none 
		long noBytes; 
		if ( ioControl(FIONREAD, (unsigned long *) &noBytes) ) 
			return noBytes; 
		else 
			return 0; 
	} 
 
	//##ModelId=424BB64201BD 
	bool setSocketNonBlocking () 
	{ 
		// set socket to non-blocking mode 
		// probably need to add more ioctl later 
		unsigned long ioctl_opt = -1; 
		return ioControl( FIONBIO, &ioctl_opt); 
 
		/* 
		unsigned long ioctl_opt = -1; 
		if ( ioctlsocket(_socket,FIONBIO,&ioctl_opt) == SOCKET_ERROR )  
		{ 
			fprintf(stderr,"ioctlsocket failed %d\n",getLastError()); 
			 
			return false; 
		} 
		else 
			return true; 
		*/ 
	} 
		 
 
 
	// recieve/send methods 
	//##ModelId=424BB64201BE 
	long send ( string & buffer ) 
	{ 
		return send( (LPTSTR) buffer.c_str(), buffer.size() ); 
	} 
 
	//##ModelId=424BB64201CC 
	long send ( LPCTSTR buffer, DWORD noToWrite ) 
	{ 
		return send( (LPTSTR) buffer, noToWrite ); 
	} 
 
	//##ModelId=424BB64201CF 
	long send ( LPTSTR pBuffer, DWORD noToWrite ) 
	{ 
		if ( !lock() ) 
			return 0; 
 
		// send to socket 
		int noWritten = 
		::send( _socket, pBuffer, noToWrite, 0 ); 
 
		unlock(); 
 
		// if error show none sent 
		if ( noWritten == SOCKET_ERROR ) 
			return 0; 
		else 
			return noWritten; 
	} 
 
	//##ModelId=424BB64201DE 
	long recieve ( LPTSTR pBuffer, DWORD noToRead ) 
	{ 
		if ( !lock() ) 
			return false; 
 
		// recieve from socket 
		int noRead = 
		recv( _socket, pBuffer, noToRead, 0 ); 
 
		// if no recieve error 
		if ( noRead == SOCKET_ERROR ) 
		{ 
			noRead = -1; 
		} 
		else 
		{ 
			// else terminate buffer 
			pBuffer[noRead] = '\0'; 
		} 
 
		unlock(); 
 
		return noRead; 
	} 
 
	//##ModelId=424BB64201ED 
	bool ioControl ( long cmd, u_long * argp ) 
	{ 
		// perfom action 
		long ret = 
		ioctlsocket(_socket,cmd,argp); 
 
		// if success show it 
		// else get error show failed 
		if ( ret == 0 ) 
			return true; 
		else 
		{ 
			// show error 
			fprintf(stderr,"ioctlsocket failed %d\n",getLastError()); 
 
			return false; 
		} 
 
	} 
 
 
	// operators 
	//##ModelId=424BB64201FB 
	operator SOCKET () 
	{ 
		return _socket; 
	} 
 
	//##ModelId=424BB64201FC 
	Socket &  operator << ( string & buffer ) 
	{ 
		send( (LPTSTR) buffer.c_str(), buffer.size() ); 
		return *this; 
	} 
 
	//##ModelId=424BB64201FE 
	Socket &  operator >> ( stringstream & strm ) 
	{ 
		send( (LPTSTR) strm.str().c_str(), strm.str().size() ); 
		return *this; 
	} 
 
	//##ModelId=424BB642020C 
	Socket &  operator << ( LPCTSTR buffer ) 
	{ 
		send( (LPTSTR) buffer, lstrlen(buffer) ); 
		return *this; 
	} 
 
	//##ModelId=424BB642020E 
	Socket &  operator << ( LPTSTR buffer ) 
	{ 
		send( buffer, lstrlen(buffer) ); 
		return *this; 
	} 
 
	// test if file open 
	//##ModelId=424BB642021B 
	bool isOpen () 
	{ 
		if ( _socket == INVALID_SOCKET ) 
			return false; 
		else 
			return true; 
	} 
}; 
 
 
 
 
 
#endif