Socket.cpp
上传用户:dzyhzl
上传日期:2019-04-29
资源大小:56270k
文件大小:4k
源码类别:

模拟服务器

开发平台:

C/C++

  1. #include "stdafx.h"
  2. #include "Socket.h"
  3. #include "Macro.h"
  4. /*
  5.  * namespace OnlineGameLib::Win32
  6.  */
  7. namespace OnlineGameLib {
  8. namespace Win32 {
  9. CSocket::CSocket()
  10. : m_socket( INVALID_SOCKET )
  11. {
  12. }
  13. CSocket::CSocket( SOCKET theSocket )
  14. : m_socket( theSocket )
  15. {
  16. if ( INVALID_SOCKET == m_socket )
  17. {
  18. throw Exception( _T("CSocket::CSocket()"),  WSAENOTSOCK );
  19. }
  20. }
  21.       
  22. CSocket::~CSocket()
  23. {
  24. if ( INVALID_SOCKET != m_socket )
  25. {
  26. try
  27. {
  28. AbortiveClose();
  29. }
  30. catch(...)
  31. {
  32. TRACE( "CSocket::~CSocket() exception!" );
  33. }
  34. }
  35. }
  36. void CSocket::Attach( SOCKET theSocket )
  37. {
  38. AbortiveClose();
  39. m_socket = theSocket;
  40. }
  41. SOCKET CSocket::Detatch()
  42. {
  43. SOCKET theSocket = m_socket;
  44. m_socket = INVALID_SOCKET;
  45. return theSocket;
  46. }
  47. void CSocket::Close()
  48. {
  49. if ( 0 != ::closesocket( m_socket ) )
  50. {
  51. throw Exception( _T("CSocket::Close()"), ::WSAGetLastError() );
  52. }
  53. }
  54. void CSocket::AbortiveClose()
  55. {
  56. LINGER lingerStruct;
  57. lingerStruct.l_onoff = 1;
  58. lingerStruct.l_linger = 0;
  59. if ( SOCKET_ERROR == ::setsockopt( m_socket, 
  60. SOL_SOCKET, 
  61. SO_LINGER, 
  62. ( char * )&lingerStruct, 
  63. sizeof( lingerStruct ) ) )
  64. {
  65. throw Exception( _T("CSocket::AbortiveClose()"), ::WSAGetLastError() );
  66. }
  67. Close();
  68. }
  69. void CSocket::Shutdown( int how )
  70. {
  71. if ( 0 != ::shutdown( m_socket, how ) )
  72. {
  73. throw Exception( _T(" CSocket::Shutdown()"), ::WSAGetLastError() );
  74. }
  75. }
  76. void CSocket::Listen( int backlog )
  77. {
  78. if ( SOCKET_ERROR == ::listen( m_socket, backlog ) )
  79. {
  80. throw Exception( _T("CSocket::Listen()"), ::WSAGetLastError() );
  81. }
  82. }
  83. void CSocket::Bind( const SOCKADDR_IN &address )
  84. {
  85. if ( SOCKET_ERROR == ::bind( m_socket, 
  86. reinterpret_cast< struct sockaddr * >( const_cast< SOCKADDR_IN * >( &address ) ),
  87. sizeof( SOCKADDR_IN ) ) )
  88. {
  89. throw Exception( _T("CSocket::Bind()"), ::WSAGetLastError() );
  90. }
  91. }
  92. void CSocket::Bind( const struct sockaddr &address, size_t addressLength )
  93. {
  94. if ( SOCKET_ERROR == ::bind( m_socket, 
  95. const_cast< struct sockaddr * >( &address ),
  96. addressLength ) )
  97. {
  98. throw Exception( _T("CSocket::Bind()"), ::WSAGetLastError() );
  99. }
  100. }
  101. void CSocket::Connect( const SOCKADDR_IN &address )
  102. {
  103. if ( SOCKET_ERROR == ::connect( m_socket, 
  104. reinterpret_cast< struct sockaddr * >( const_cast<SOCKADDR_IN *>( &address ) ), 
  105. sizeof( SOCKADDR_IN ) ) )
  106. {
  107. throw Exception( _T("CSocket::Connect()"), ::WSAGetLastError() );
  108. }
  109. }
  110. void CSocket::Connect( const struct sockaddr &address, size_t addressLength )
  111. {
  112. /*
  113.  * Loss of precision (arg. no. 3) (unsigned int to int)
  114.  */
  115. if ( SOCKET_ERROR == ::connect( m_socket, 
  116. const_cast<struct sockaddr *>( &address ), 
  117. addressLength ) )
  118. {
  119. throw Exception( _T("CSocket::Connect()"), ::WSAGetLastError() );
  120. }
  121. }
  122. /*
  123.  * CSocket::InternetAddress
  124.  */
  125. CSocket::InternetAddress::InternetAddress( unsigned long address, unsigned short port )
  126. {
  127. /*
  128.  * member 'sockaddr_in::sin_zero not initialised
  129.  * ...
  130.  */
  131. sin_family = AF_INET;
  132. sin_port = htons( port );
  133. sin_addr.s_addr = htonl( address );  
  134. }
  135. CSocket::InternetAddress::InternetAddress(
  136. const _tstring &addressToConnectServer,
  137. unsigned short port  )
  138. {
  139. sin_family = AF_INET;
  140. sin_port = htons( port );
  141. sin_addr.s_addr = inet_addr( addressToConnectServer.c_str() ); 
  142. /*
  143.  * member 'sockaddr_in::sin_zero not initialised
  144.  */
  145. }
  146. /*
  147.  * CSocket::Exception
  148.  */
  149. CSocket::Exception::Exception( const _tstring &where, DWORD error )
  150. : CWin32Exception( where, error )
  151. {
  152. }
  153. } // End of namespace OnlineGameLib
  154. } // End of namespace Win32