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

模拟服务器

开发平台:

C/C++

  1. /********************************************************************
  2. created: 2003/02/19
  3. file base: EventSelect
  4. file ext: h
  5. author: liupeng
  6. purpose:
  7. *********************************************************************/
  8. #ifndef __INCLUDE_EVENTSELECT_H__
  9. #define __INCLUDE_EVENTSELECT_H__
  10. #if defined (_MSC_VER) && (_MSC_VER >= 1020)
  11. #pragma once
  12. #endif
  13. #ifndef _WINDOWS_
  14. #define WIN32_LEAN_AND_MEAN
  15. #include <windows.h>
  16. #undef WIN32_LEAN_AND_MEAN
  17. #endif
  18. #include <winsock2.h>
  19. #include "Win32Exception.h"
  20. /*
  21.  * namespace OnlineGameLib::Win32
  22.  */
  23. namespace OnlineGameLib {
  24. namespace Win32 {
  25. class CEventSelect
  26. {
  27. public:
  28. CEventSelect();
  29. ~CEventSelect();
  30. void AssociateEvent( SOCKET s, long lNetworkEvents );
  31. void DissociateEvent();
  32. bool WaitForEnumEvent( SOCKET s, DWORD dwTimeout );
  33. bool IsError() { return ( bool )( ( m_nErrorCode >> 1 ) & 0x1 ); };
  34. /*
  35.  * return value
  36.  *
  37.  * 0 : success
  38.  * 1 : fail
  39.  * 3 : exception
  40.  */
  41. enum enumExitValue
  42. {
  43. enumSuccess = 0x0,
  44. enumFail = 0x1,
  45. enumException = 0x3
  46. };
  47. int Read();
  48. int Write();
  49. int Connect();
  50. int Close();
  51. private:
  52. WSAEVENT m_event;
  53. WSANETWORKEVENTS m_networkEvents;
  54. int m_nErrorCode;
  55. /*
  56.  * No copies do not implement
  57.  */
  58. CEventSelect( const CEventSelect &rhs );
  59. CEventSelect &operator=( const CEventSelect &rhs );
  60. };
  61. inline bool CEventSelect::WaitForEnumEvent( SOCKET s, DWORD dwTimeout )
  62. {
  63. /*
  64.  * Clear the older network events and wait to update
  65.  */
  66. m_nErrorCode = 0;
  67. memset( &m_networkEvents, 0, sizeof( WSANETWORKEVENTS ) );
  68. DWORD dwRet = ::WSAWaitForMultipleEvents(
  69. 1,
  70. &m_event,
  71. FALSE,
  72. dwTimeout,
  73. FALSE );
  74. if ( WSA_WAIT_TIMEOUT == dwRet || WSA_WAIT_FAILED == dwRet )
  75. {
  76. return false;
  77. }
  78. ::WSAEnumNetworkEvents(
  79. s,
  80. m_event,
  81. &m_networkEvents );
  82. return true;
  83. }
  84. inline int CEventSelect::Read()
  85. {
  86. if ( m_networkEvents.lNetworkEvents & FD_READ )
  87. {
  88. if ( m_networkEvents.iErrorCode[FD_READ_BIT] != 0 )
  89. {
  90. /*
  91.  * throw CWin32Exception( _T("CEventSelect : FD_READ failed with error "), 
  92.  * m_networkEvents.iErrorCode[FD_READ_BIT] );
  93.  */
  94. m_nErrorCode |= enumException;
  95. return enumException;
  96. }
  97. return enumSuccess;
  98. }
  99. return enumFail;
  100. }
  101. inline int CEventSelect::Write()
  102. {
  103. if ( m_networkEvents.lNetworkEvents & FD_WRITE )
  104. {
  105. if ( m_networkEvents.iErrorCode[FD_WRITE_BIT] != 0 )
  106. {
  107. /*
  108.  * throw CWin32Exception( _T("CEventSelect : FD_WRITE failed with error "), 
  109.  * m_networkEvents.iErrorCode[FD_WRITE_BIT] );
  110.  */
  111. m_nErrorCode |= enumException;
  112. return enumException;
  113. }
  114. return enumSuccess;
  115. }
  116. return enumFail;
  117. }
  118. inline int CEventSelect::Connect()
  119. {
  120. if ( m_networkEvents.lNetworkEvents & FD_CONNECT )
  121. {
  122. if ( m_networkEvents.iErrorCode[FD_CONNECT_BIT] != 0 )
  123. {
  124. /*
  125.  * throw CWin32Exception( _T("CEventSelect : FD_CONNECT failed with error "), 
  126.  * m_networkEvents.iErrorCode[FD_CONNECT_BIT] );
  127.  */
  128. m_nErrorCode |= enumException;
  129. return enumException;
  130. }
  131. return enumSuccess;
  132. }
  133. return enumFail;
  134. }
  135. inline int CEventSelect::Close()
  136. {
  137. if ( m_networkEvents.lNetworkEvents & FD_CLOSE )
  138. {
  139. if ( m_networkEvents.iErrorCode[FD_CLOSE_BIT] != 0 )
  140. {
  141. /*
  142.  * throw CWin32Exception( _T("CEventSelect : FD_CLOSE failed with error "), 
  143.  * m_networkEvents.iErrorCode[FD_CLOSE_BIT] );
  144.  */
  145. m_nErrorCode |= enumException;
  146. return enumException;
  147. }
  148. return enumSuccess;
  149. }
  150. return enumFail;
  151. }
  152. } // End of namespace OnlineGameLib
  153. } // End of namespace Win32
  154. #endif //__INCLUDE_EVENTSELECT_H__