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

模拟服务器

开发平台:

C/C++

  1. #include "EventSelect.h"
  2. /*
  3.  * namespace OnlineGameLib::Win32
  4.  */
  5. namespace OnlineGameLib {
  6. namespace Win32 {
  7. CEventSelect::CEventSelect()
  8. : m_event(WSA_INVALID_EVENT)
  9. {
  10. memset( &m_networkEvents, 0, sizeof( WSANETWORKEVENTS ) );
  11. }
  12. CEventSelect::~CEventSelect()
  13. {
  14. if ( WSA_INVALID_EVENT != m_event )
  15. {
  16. ::WSACloseEvent( m_event );
  17. m_event = WSA_INVALID_EVENT;
  18. }
  19. }
  20. void CEventSelect::AssociateEvent( SOCKET s, long lNetworkEvents )
  21. {
  22. if ( WSA_INVALID_EVENT == ( m_event = ::WSACreateEvent() ) )
  23. {
  24. throw CWin32Exception( _T("CEventSelect::AssociateEvent() - WSACreateEvent"), ::WSAGetLastError() );
  25. }
  26. if ( SOCKET_ERROR == ::WSAEventSelect( s, m_event, lNetworkEvents ) )
  27. {
  28. throw CWin32Exception( _T("CEventSelect::AssociateEvent() - WSAEventSelect"), ::WSAGetLastError() );
  29. }
  30. }
  31. bool CEventSelect::WaitForEnumEvent( SOCKET s, DWORD dwTimeout )
  32. {
  33. /*
  34.  * Clear the older network events and wait to update
  35.  */
  36. memset( &m_networkEvents, 0, sizeof( WSANETWORKEVENTS ) );
  37. DWORD dwRet = ::WSAWaitForMultipleEvents(
  38. 1,
  39. &m_event,
  40. FALSE,
  41. dwTimeout,
  42. FALSE );
  43. if ( WSA_WAIT_TIMEOUT == dwRet || WSA_WAIT_FAILED == dwRet )
  44. {
  45. return false;
  46. }
  47. ::WSAEnumNetworkEvents(
  48. s,
  49. m_event,
  50. &m_networkEvents );
  51. return true;
  52. }
  53. bool CEventSelect::IsRead()
  54. {
  55. if ( m_networkEvents.lNetworkEvents & FD_READ )
  56. {
  57. if ( m_networkEvents.iErrorCode[FD_READ_BIT] != 0 )
  58. {
  59. throw CWin32Exception( _T("CEventSelect : FD_READ failed with error "), 
  60. m_networkEvents.iErrorCode[FD_READ_BIT] );
  61. }
  62. return true;
  63. }
  64. return false;
  65. }
  66. bool CEventSelect::IsWrite()
  67. {
  68. if ( m_networkEvents.lNetworkEvents & FD_WRITE )
  69. {
  70. if ( m_networkEvents.iErrorCode[FD_WRITE_BIT] != 0 )
  71. {
  72. throw CWin32Exception( _T("CEventSelect : FD_WRITE failed with error "), 
  73. m_networkEvents.iErrorCode[FD_WRITE_BIT] );
  74. }
  75. return true;
  76. }
  77. return false;
  78. }
  79. bool CEventSelect::IsConnect()
  80. {
  81. if ( m_networkEvents.lNetworkEvents & FD_CONNECT )
  82. {
  83. if ( m_networkEvents.iErrorCode[FD_CONNECT_BIT] != 0 )
  84. {
  85. throw CWin32Exception( _T("CEventSelect : FD_CONNECT failed with error "), 
  86. m_networkEvents.iErrorCode[FD_CONNECT_BIT] );
  87. }
  88. return true;
  89. }
  90. return false;
  91. }
  92. bool CEventSelect::IsClose()
  93. {
  94. if ( m_networkEvents.lNetworkEvents & FD_CLOSE )
  95. {
  96. if ( m_networkEvents.iErrorCode[FD_CLOSE_BIT] != 0 )
  97. {
  98. throw CWin32Exception( _T("CEventSelect : FD_CLOSE failed with error "), 
  99. m_networkEvents.iErrorCode[FD_CLOSE_BIT] );
  100. }
  101. return true;
  102. }
  103. return false;
  104. }
  105. } // End of namespace OnlineGameLib
  106. } // End of namespace Win32