socketimpl.cpp
来自「天之炼狱1服务器端源文件游戏服务端不完整」· C++ 代码 · 共 606 行
CPP
606 行
//////////////////////////////////////////////////////////////////////////// SocketImpl.cpp//// by Reiot////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// include files//////////////////////////////////////////////////#include "SocketImpl.h"#include "FileAPI.h"#include "SocketAPI.h"#if __LINUX__#include <sys/socket.h>#include <arpa/inet.h> // for inet_ntoa()#elif __WINDOWS__#endif//////////////////////////////////////////////////// forward declarations//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // SocketImpl::SocketImpl () throw ( Error );// // Parameters // none// // Exceptions// Error// ////////////////////////////////////////////////////////////////////////SocketImpl::SocketImpl () throw (): m_SocketID(INVALID_SOCKET), m_Host("Unknown"), m_Port(0){}//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////SocketImpl::SocketImpl ( uint port ) throw (): m_SocketID(INVALID_SOCKET), m_Host("Unknown"), m_Port(port){}//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////SocketImpl::SocketImpl ( const string & host , uint port ) throw (): m_SocketID(INVALID_SOCKET), m_Host(host), m_Port(port){}//////////////////////////////////////////////////////////////////////////// SocketImpl::SocketImpl ( const SocketImpl & impl ) throw ();//// copy constructor //// Parameters// impl - socket implementation object//// Exceptions// none//////////////////////////////////////////////////////////////////////////SocketImpl::SocketImpl ( const SocketImpl & impl ) throw (): m_SocketID(impl.m_SocketID), m_Host(impl.m_Host), m_Port(impl.m_Port){}//////////////////////////////////////////////////////////////////////////// SocketImpl::~SocketImpl () throw ( Error );//// virtual destructor//// Parameters// none//// Exceptions// Error//////////////////////////////////////////////////////////////////////////SocketImpl::~SocketImpl () throw ( Error ){ __BEGIN_TRY close(); __END_CATCH} //////////////////////////////////////////////////////////////////////// create connection//////////////////////////////////////////////////////////////////////void SocketImpl::create () throw ( Error ){ __BEGIN_TRY // create socket m_SocketID = SocketAPI::socket_ex( AF_INET , SOCK_STREAM , 0 ); // clear socket address structure memset( &m_SockAddr , 0 , sizeof(m_SockAddr) ); // set socket address's family to "AF_INET" m_SockAddr.sin_family = AF_INET; __END_CATCH}//////////////////////////////////////////////////////////////////////// close connection//////////////////////////////////////////////////////////////////////void SocketImpl::close () throw ( Error ){ __BEGIN_TRY if( !isSockError() ) { try { SocketAPI::closesocket_ex( m_SocketID ); } catch ( FileNotOpenedException& ) { // if already closed, ignore... } } __END_CATCH}//////////////////////////////////////////////////////////////////////// bind address to socket//////////////////////////////////////////////////////////////////////void SocketImpl::bind () throw ( BindException , Error ){ __BEGIN_TRY m_SockAddr.sin_addr.s_addr = htonl(INADDR_ANY); m_SockAddr.sin_port = htons(m_Port); SocketAPI::bind_ex( m_SocketID , (const struct sockaddr *)&m_SockAddr , sizeof(m_SockAddr) ); __END_CATCH}//////////////////////////////////////////////////////////////////////// bind address to socket//////////////////////////////////////////////////////////////////////void SocketImpl::bind ( uint port ) throw ( BindException , Error ){ __BEGIN_TRY // set server's port m_Port = port; m_SockAddr.sin_addr.s_addr = htonl(INADDR_ANY); m_SockAddr.sin_port = htons(m_Port); SocketAPI::bind_ex( m_SocketID , (const struct sockaddr *)&m_SockAddr , sizeof(m_SockAddr) ); __END_CATCH}//////////////////////////////////////////////////////////////////////// bind address to socket//////////////////////////////////////////////////////////////////////void SocketImpl::listen ( uint backlog ) throw ( Error ){ __BEGIN_TRY SocketAPI::listen_ex( m_SocketID , backlog ); __END_CATCH}//////////////////////////////////////////////////////////////////////// connect to remote host//////////////////////////////////////////////////////////////////////void SocketImpl::connect ( const string & host , uint port ) throw ( ConnectException , Error ){ __BEGIN_TRY m_Host = host; m_Port = port; // set sockaddr's host m_SockAddr.sin_addr.s_addr = inet_addr( m_Host.c_str() ); // set sockaddr's port m_SockAddr.sin_port = htons(m_Port); // try to connect to peer host SocketAPI::connect_ex( m_SocketID , (const struct sockaddr *)&m_SockAddr , sizeof(m_SockAddr) ); __END_CATCH}//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////void SocketImpl::connect () throw ( ConnectException , Error ){ __BEGIN_TRY // set sockaddr's host m_SockAddr.sin_addr.s_addr = inet_addr( m_Host.c_str() ); // set sockaddr's port m_SockAddr.sin_port = htons(m_Port); // try to connect to peer host SocketAPI::connect_ex( m_SocketID , (const struct sockaddr *)&m_SockAddr , sizeof(m_SockAddr) ); __END_CATCH} //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////SocketImpl * SocketImpl::accept () throw ( NonBlockingIOException , ConnectException , Error ){ __BEGIN_TRY // make client socket address structure ready SOCKADDR_IN ClientAddr; memset( &ClientAddr , 0 , sizeof(ClientAddr) ); uint len = sizeof(ClientAddr); // get client socket descriptor uint ClientID = SocketAPI::accept_ex( m_SocketID , (struct sockaddr *)&ClientAddr , &len ); // create MSocketImpl with socket descriptor SocketImpl * client = new SocketImpl(); // initialize client socket implementation object client->m_SocketID = ClientID; memcpy( &(client->m_SockAddr) , &ClientAddr , sizeof(SOCKADDR_IN) ); client->m_Host = client->_getHost(); client->m_Port = client->_getPort(); // return SocketImpl return client; __END_CATCH}//////////////////////////////////////////////////////////////////////// send data to peer//////////////////////////////////////////////////////////////////////uint SocketImpl::send ( const void * buf , uint len , uint flags ) throw ( IOException , InvalidProtocolException, Error ){ __BEGIN_TRY uint result; try { result = SocketAPI::send_ex( m_SocketID , buf , len , flags ); } catch ( Throwable & t ) { cout << "SocketImpl::send Exception Check!" << endl; cout << t.toString() << endl; throw InvalidProtocolException( "澜 咯鳖瘤 棵扼吭焙" ); } return result; __END_CATCH} //////////////////////////////////////////////////////////////////////// receive data from peer//////////////////////////////////////////////////////////////////////uint SocketImpl::receive ( void * buf , uint len , uint flags ) throw ( IOException , Error ){ __BEGIN_TRY return SocketAPI::recv_ex( m_SocketID , buf , len , flags ); __END_CATCH} //////////////////////////////////////////////////////////////////////// how much available?//////////////////////////////////////////////////////////////////////uint SocketImpl::available () const throw ( Error ){ __BEGIN_TRY return SocketAPI::availablesocket_ex( m_SocketID ); __END_CATCH} //////////////////////////////////////////////////////////////////////// get socket's linger status//////////////////////////////////////////////////////////////////////uint SocketImpl::getLinger () const throw ( Error ){ __BEGIN_TRY struct linger ling; uint len = sizeof(ling); SocketAPI::getsockopt_ex( m_SocketID , SOL_SOCKET , SO_LINGER , &ling , &len ); return ling.l_linger; __END_CATCH}//////////////////////////////////////////////////////////////////////// set socket's linger status//////////////////////////////////////////////////////////////////////void SocketImpl::setLinger ( uint lingertime ) throw ( Error ){ __BEGIN_TRY struct linger ling; ling.l_onoff = lingertime > 0 ? 1 : 0; ling.l_linger = lingertime; SocketAPI::setsockopt_ex( m_SocketID , SOL_SOCKET , SO_LINGER , &ling , sizeof(ling) ); __END_CATCH} //////////////////////////////////////////////////////////////////////// get socket's reuse address status//////////////////////////////////////////////////////////////////////bool SocketImpl::isReuseAddr () const throw ( Error ){ __BEGIN_TRY int reuse; uint len = sizeof(reuse); SocketAPI::getsockopt_ex( m_SocketID , SOL_SOCKET , SO_REUSEADDR , &reuse , &len ); return reuse == 1; __END_CATCH}//////////////////////////////////////////////////////////////////////// get socket's reuse address status//////////////////////////////////////////////////////////////////////bool SocketImpl::isSockError () const throw ( Error ){ __BEGIN_TRY int error; uint len = sizeof(error); int Result = SocketAPI::getsockopt_ex2( m_SocketID , SOL_SOCKET , SO_ERROR , &error, &len ); if( Result == 0 ) return false; else return true; __END_CATCH}//////////////////////////////////////////////////////////////////////// set socket's reuse address status//////////////////////////////////////////////////////////////////////void SocketImpl::setReuseAddr ( bool on ) throw ( Error ){ __BEGIN_TRY int opt = on == true ? 1 : 0; SocketAPI::setsockopt_ex( m_SocketID , SOL_SOCKET , SO_REUSEADDR , &opt , sizeof(opt) ); __END_CATCH} //////////////////////////////////////////////////////////////////////// get socket's nonblocking status//////////////////////////////////////////////////////////////////////bool SocketImpl::isNonBlocking () const throw ( Error ){ __BEGIN_TRY return SocketAPI::getsocketnonblocking_ex( m_SocketID ); __END_CATCH}//////////////////////////////////////////////////////////////////////// set socket's nonblocking status//////////////////////////////////////////////////////////////////////void SocketImpl::setNonBlocking ( bool on ) throw ( Error ){ __BEGIN_TRY SocketAPI::setsocketnonblocking_ex( m_SocketID , on ); __END_CATCH} //////////////////////////////////////////////////////////////////////// get receive buffer size//////////////////////////////////////////////////////////////////////uint SocketImpl::getReceiveBufferSize () const throw ( Error ){ __BEGIN_TRY uint ReceiveBufferSize; uint size = sizeof(ReceiveBufferSize); SocketAPI::getsockopt_ex( m_SocketID , SOL_SOCKET , SO_SNDBUF , &ReceiveBufferSize, &size ); return ReceiveBufferSize; __END_CATCH}//////////////////////////////////////////////////////////////////////// set receive buffer size//////////////////////////////////////////////////////////////////////void SocketImpl::setReceiveBufferSize ( uint ReceiveBufferSize ) throw ( Error ){ __BEGIN_TRY SocketAPI::setsockopt_ex( m_SocketID , SOL_SOCKET , SO_SNDBUF , &ReceiveBufferSize, sizeof(ReceiveBufferSize) ); __END_CATCH} //////////////////////////////////////////////////////////////////////// get send buffer size//////////////////////////////////////////////////////////////////////uint SocketImpl::getSendBufferSize () const throw ( Error ){ __BEGIN_TRY uint SendBufferSize; uint size = sizeof(SendBufferSize); SocketAPI::getsockopt_ex( m_SocketID , SOL_SOCKET , SO_SNDBUF , &SendBufferSize, &size ); return SendBufferSize; __END_CATCH}////////////////////////////////////////////////////////////////////////// void SocketImpl::setSendBufferSize ( uint SendBufferSize ) throw ( Error )//// set send buffer size//// Parameters//// Return//// Exceptions// Error from setsockopt_ex()////////////////////////////////////////////////////////////////////////void SocketImpl::setSendBufferSize ( uint SendBufferSize ) throw ( Error ){ __BEGIN_TRY SocketAPI::setsockopt_ex( m_SocketID , SOL_SOCKET , SO_SNDBUF , &SendBufferSize, sizeof(SendBufferSize) ); __END_CATCH} ////////////////////////////////////////////////////////////////////////// string SocketImpl::_getHost () const throw ();//// get host address of this socket//// Parameters// none//// Return// host string//// Exceptions// none////////////////////////////////////////////////////////////////////////string SocketImpl::_getHost () const throw (){ return string( inet_ntoa( m_SockAddr.sin_addr ) );}////////////////////////////////////////////////////////////////////////// void SocketImpl::_setHost ( const string & host ) throw ()//// set host address of this socket//// Parameters// host - peer host's address//// Return// none//// Exceptions// none////////////////////////////////////////////////////////////////////////void SocketImpl::_setHost ( const string & host ) throw (){ m_SockAddr.sin_addr.s_addr = inet_addr( host.c_str() );} ////////////////////////////////////////////////////////////////////////// uint SocketImpl::_getPort () const throw ()//// get port of this socket//// Parameters// none//// Return// port//// Exceptions// none////////////////////////////////////////////////////////////////////////uint SocketImpl::_getPort () const throw (){ return ntohs( m_SockAddr.sin_port );}////////////////////////////////////////////////////////////////////////// void SocketImpl::_setPort ( uint port ) throw ()//// set host address of this socket//// Parameters// port - peer host's port//// Return// none//// Exceptions// none////////////////////////////////////////////////////////////////////////void SocketImpl::_setPort ( uint port ) throw (){ m_SockAddr.sin_port = htons(port);}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?