Server.cpp
上传用户:popouu88
上传日期:2013-02-11
资源大小:2894k
文件大小:5k
源码类别:

IP电话/视频会议

开发平台:

Visual C++

  1. // Server.cpp: implementation of the CServer class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "Server.h"
  5. //////////////////////////////////////////////////////////////////////
  6. // Construction/Destruction
  7. //////////////////////////////////////////////////////////////////////
  8. CServer::CServer( )
  9. {
  10. }
  11. CServer::~CServer( )
  12. {
  13. }
  14. bool CServer::Run( const int port )
  15. {
  16. if( this->m_server.Create( CServer::OnAccept , this , port ) )
  17. {
  18. this->logFile.Write( "中央管理服务器初始化成功,正在监听端口 : %d ...n" , port );
  19. return true;
  20. }
  21. this->logFile.Write( "中央管理服务器初始化失败n" );
  22. return false;
  23. }
  24. void CServer::Stop( void )
  25. {
  26. this->logFile.Write( "关闭中央管理服务器监听n" );
  27. this->m_server.Close( );
  28. this->logFile.Write( "释放客户端资源n" );
  29. this->GetMCUInformation( ).Release( );
  30. }
  31. void CServer::OnAccept( void * wParam , CTCP &server )
  32. {
  33. CServer * pThis = ( CServer * )wParam;
  34. CTCP * client = new CTCP( );
  35. client->SetData( ( int )pThis );
  36. if( server.Accept( client ) )
  37. {
  38. pThis->logFile.Write( "服务器接收到一个连接n" );
  39. CThread::Run( CServer::OnCommand , client );
  40. }
  41. else 
  42. {
  43. client->Close( );
  44. delete client;
  45. if( pThis->m_server.IsListen( ) )
  46. {
  47. pThis->logFile.Write( "服务器监听失败,再次启动服务器n" );
  48. }
  49. }
  50. }
  51. void CServer::OnCommand( void * wParam )
  52. {
  53. CTCP * client = ( CTCP * )wParam;
  54.     //取出本类指针
  55. CServer * pThis = ( CServer * )client->GetData( ); 
  56. client->SetData( 0 );
  57. CBuffer buffer;
  58. pThis->logFile.Write( "服务器为该连接启动一个线程n" );
  59. while( client->Receive( buffer ) )
  60. {
  61. switch( *( int * )( buffer.GetBuffer( ) + INT_SIZE ) ) 
  62. {//客户端注册
  63. case PRegisterREQTAG : pThis->OnRegister( client , buffer ); break;
  64.         //客户端请求在线用户信息
  65. case POnlineUserREQTAG : pThis->OnOnlineUserREQ( client , buffer ); break;
  66.         //客户端更新在线用户信息
  67. case POnlineUserRESTAG : pThis->OnOnlineUserRES( client , buffer ); break;
  68. }
  69. }//删除该节点
  70. CMCUNode * node = pThis->GetMCUInformation( ).GetMCUNode( ( int )client );
  71. pThis->logFile.Write( "MCU服务器 %s 退出了程序,删除该节点的信息n" , node->mcu_name.c_str( ) );
  72. pThis->GetMCUInformation( ).RemoveMCUNode( ( int )client );
  73. }
  74. //子MCU注册
  75. void CServer::OnRegister( CTCP * client , CBuffer & buffer )
  76. {
  77. PRegisterREQ req;
  78. req.parseData( buffer );
  79. CMCUNode * node = this->GetMCUInformation( ).AddMCUNode( client , req.userName.c_str( ) );
  80.     //打印信息
  81. this->logFile.Write( "用户 %s 注册 %s , id号:%dn" , req.userName.c_str( ) ,  node ? "成功" : "失败" , node ? node->mcu_id : 0 );
  82.     //回复信息 
  83. PRegisterRES res;
  84. res.assembleData( ! node , node ? node->mcu_id : 0 );
  85. client->Send( res.buffer );
  86. }
  87. //请求在线用户
  88. void CServer::OnOnlineUserREQ( CTCP * client , CBuffer & buffer ) 
  89. {
  90. CMCUNode * mcuNode = this->GetMCUInformation( ).GetMCUNode( ( int )client );
  91. if( ! mcuNode )
  92. {
  93. return;
  94. }
  95. //打印信息
  96. this->logFile.Write( "MCU服务器 %s 请求其他MCU的在线用户信息n" , mcuNode->mcu_name.c_str( ) );
  97. //回复在线用户信息
  98. INT_PTR_MAP * m_map = this->GetMCUInformation( ).LockMap( );
  99. for( INT_PTR_MAP::iterator itr = m_map->begin( ); itr != m_map->end( ); itr ++ )
  100. {
  101. CMCUNode * mcu = ( CMCUNode * )itr->second;
  102. if( mcu->mcu_id != mcuNode->mcu_id )
  103. {
  104. for( INT_PTR_MAP::iterator i = mcu->online_map.begin( ); i != mcu->online_map.end( ); i ++ )
  105. {
  106. CClientNode * node = ( CClientNode * )i->second;
  107. POnlineUserRES res;
  108. res.assembleData( node->user_id , node->user_name.c_str( ) , node->isCharement , node->data_name.c_str( ) , false );
  109. client->Send( res.buffer );
  110. }
  111. }
  112. }
  113. this->GetMCUInformation( ).UnlockMap( );
  114. }
  115. //在线用户信息状态的改变
  116. void CServer::OnOnlineUserRES( CTCP * client , CBuffer & buffer ) 
  117. {
  118. CMCUNode * mcuNode = this->GetMCUInformation( ).GetMCUNode( ( int )client );
  119. if( ! mcuNode )
  120. return;
  121. POnlineUserRES res;
  122. res.parseData( buffer );
  123. CClientNode * clientNode = mcuNode->GetClientNode( res.user_id );
  124.     //用户在线
  125. if( ! res.user_name.empty( ) )
  126. {   //如果找不到该用户,那么新增一个用户
  127. if( ! clientNode )
  128. {   //打印信息
  129. this->logFile.Write( "MCU服务器 %s 增加一个用户 %sn", mcuNode->mcu_name.c_str( ) , res.user_name.c_str( ) );
  130. mcuNode->AddClientNode( res.user_id , res.user_name.c_str( ) , res.data_name.c_str( ) , res.isCharement );
  131. }//更改用户的状态
  132. else
  133. {  
  134. clientNode->data_name = res.data_name;
  135. clientNode->isCharement = res.isCharement;
  136. //打印信息
  137. this->logFile.Write( "MCU服务器 %s 的一个用户 %s 状态 : %sn", mcuNode->mcu_name.c_str( ) , res.user_name.c_str( ) , ! clientNode->data_name.empty( ) ? "开会中" : "空闲" );
  138. }
  139. }//用户退出程序
  140. else if( clientNode )
  141. { //打印信息
  142. this->logFile.Write( "MCU服务器 %s 的一个用户 %s 退出了系统n", mcuNode->mcu_name.c_str( ) , clientNode->user_name.c_str( ) );
  143. mcuNode->RemoveClientNode( clientNode->user_id );
  144. clientNode = NULL;
  145. }
  146. }