CChatServer.cpp
上传用户:power_led
上传日期:2013-04-11
资源大小:373k
文件大小:7k
源码类别:

ICQ/即时通讯

开发平台:

Visual C++

  1. // CChatServer.cpp : Defines the class behaviors for the application.
  2. //
  3. #include "stdafx.h"
  4. #include "CChatServer.h"
  5. #include "SetServerPortDlg.h"
  6. #include "MyTreeView.h"
  7. #include "ClientSocket.h"
  8. #include "CIniFile.h"
  9. #include "MainFrm.h"
  10. #include "CChatServerDoc.h"
  11. #include "CChatServerView.h"
  12. #ifdef _DEBUG
  13. #define new DEBUG_NEW
  14. #undef THIS_FILE
  15. static char THIS_FILE[] = __FILE__;
  16. #endif
  17. /////////////////////////////////////////////////////////////////////////////
  18. // CCChatServerApp
  19. BEGIN_MESSAGE_MAP(CCChatServerApp, CWinApp)
  20. //{{AFX_MSG_MAP(CCChatServerApp)
  21. ON_COMMAND(ID_APP_ABOUT, OnAppAbout)
  22. // NOTE - the ClassWizard will add and remove mapping macros here.
  23. //    DO NOT EDIT what you see in these blocks of generated code!
  24. //}}AFX_MSG_MAP
  25. // Standard file based document commands
  26. ON_COMMAND(ID_FILE_NEW, CWinApp::OnFileNew)
  27. ON_COMMAND(ID_FILE_OPEN, CWinApp::OnFileOpen)
  28. // Standard print setup command
  29. ON_COMMAND(ID_FILE_PRINT_SETUP, CWinApp::OnFilePrintSetup)
  30. END_MESSAGE_MAP()
  31. /////////////////////////////////////////////////////////////////////////////
  32. // CCChatServerApp construction
  33. CCChatServerApp::CCChatServerApp():bInit(FALSE)
  34. {
  35. // TODO: add construction code here,
  36. // Place all significant initialization in InitInstance
  37. m_pClientSocketList = new CPtrList();
  38. CIniFile m_IniFile;
  39. bInit =  m_IniFile.Create("RoomList.ini");
  40. if(bInit)
  41. {
  42. int   iRoomNum;
  43. m_IniFile.GetVarInt("ROOMNUM","RoomNumber",iRoomNum);
  44. for(int i = 1; i<=iRoomNum; i++)
  45. {
  46. CString  *strRoom = new CString ;
  47. CString strTemp ;;
  48. strTemp.Format("Room%d",i);
  49. m_IniFile.GetVarStr("ROOMNAME",strTemp,*strRoom);
  50. m_ChatRoomList.AddTail(strRoom);
  51. }
  52. }
  53. }
  54. /////////////////////////////////////////////////////////////////////////////
  55. // The one and only CCChatServerApp object
  56. CCChatServerApp theApp;
  57. CCriticalSection g_cs;
  58. /////////////////////////////////////////////////////////////////////////////
  59. // CCChatServerApp initialization
  60. BOOL CCChatServerApp::InitInstance()
  61. {
  62. if(!bInit)
  63. {
  64. AfxMessageBox("初始化文件不存在");
  65. return FALSE;
  66. }
  67. if (!AfxSocketInit())
  68. {
  69. return FALSE;
  70. }
  71. AfxEnableControlContainer();
  72. // Standard initialization
  73. // If you are not using these features and wish to reduce the size
  74. //  of your final executable, you should remove from the following
  75. //  the specific initialization routines you do not need.
  76. #ifdef _AFXDLL
  77. Enable3dControls(); // Call this when using MFC in a shared DLL
  78. #else
  79. Enable3dControlsStatic(); // Call this when linking to MFC statically
  80. #endif
  81. // Change the registry key under which our settings are stored.
  82. // TODO: You should modify this string to be something appropriate
  83. // such as the name of your company or organization.
  84. SetRegistryKey(_T("Local AppWizard-Generated Applications"));
  85. LoadStdProfileSettings();  // Load standard INI file options (including MRU)
  86. // Register the application's document templates.  Document templates
  87. //  serve as the connection between documents, frame windows and views.
  88. CSingleDocTemplate* pDocTemplate;
  89. pDocTemplate = new CSingleDocTemplate(
  90. IDR_MAINFRAME,
  91. RUNTIME_CLASS(CCChatServerDoc),
  92. RUNTIME_CLASS(CMainFrame),       // main SDI frame window
  93. //RUNTIME_CLASS(CMyTreeView));
  94. NULL);
  95. AddDocTemplate(pDocTemplate);
  96. // Parse command line for standard shell commands, DDE, file open
  97. CCommandLineInfo cmdInfo;
  98. ParseCommandLine(cmdInfo);
  99. // Dispatch commands specified on the command line
  100. if (!ProcessShellCommand(cmdInfo))
  101. {
  102. return FALSE;
  103. }
  104. // The one and only window has been initialized, so show and update it.
  105. //
  106. // Place all significant initialization in InitInstance
  107. m_pMainWnd->ShowWindow(SW_SHOW);
  108. m_pMainWnd->UpdateWindow();
  109. m_pMainWnd->SetWindowText("会议中心");
  110. CSetServerPortDlg Dlg;
  111. if(Dlg.DoModal() == IDCANCEL)
  112. {
  113. return FALSE;
  114. }
  115. else
  116. {
  117. if(!m_skServerSocket.Create(Dlg.m_iServerPort))
  118. {
  119. if(m_ChatRoomList.GetCount())
  120. {
  121. m_ChatRoomList.RemoveAll();
  122. }
  123. return FALSE;
  124. }
  125. }
  126. if(!m_skServerSocket.Listen())
  127. { return FALSE;
  128. }
  129. TaskIcon.cbSize = sizeof(TaskIcon);
  130. TaskIcon.hWnd = AfxGetMainWnd()->GetSafeHwnd();
  131. lstrcpy(TaskIcon.szTip,_T("服务器正在运行..."));
  132. TaskIcon.uFlags = 0x07;
  133. TaskIcon.hIcon = LoadIcon(IDR_MAINFRAME);
  134. TaskIcon.uCallbackMessage = WM_TASKICON;
  135. Shell_NotifyIcon(NIM_ADD,&TaskIcon);
  136. return TRUE;
  137. }
  138. /////////////////////////////////////////////////////////////////////////////
  139. // CAboutDlg dialog used for App About
  140. class CAboutDlg : public CDialog
  141. {
  142. public:
  143. CAboutDlg();
  144. // Dialog Data
  145. //{{AFX_DATA(CAboutDlg)
  146. enum { IDD = IDD_ABOUTBOX };
  147. //}}AFX_DATA
  148. // ClassWizard generated virtual function overrides
  149. //{{AFX_VIRTUAL(CAboutDlg)
  150. protected:
  151. virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
  152. //}}AFX_VIRTUAL
  153. // Implementation
  154. protected:
  155. //{{AFX_MSG(CAboutDlg)
  156. // No message handlers
  157. //}}AFX_MSG
  158. DECLARE_MESSAGE_MAP()
  159. };
  160. CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
  161. {
  162. //{{AFX_DATA_INIT(CAboutDlg)
  163. //}}AFX_DATA_INIT
  164. }
  165. void CAboutDlg::DoDataExchange(CDataExchange* pDX)
  166. {
  167. CDialog::DoDataExchange(pDX);
  168. //{{AFX_DATA_MAP(CAboutDlg)
  169. //}}AFX_DATA_MAP
  170. }
  171. BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
  172. //{{AFX_MSG_MAP(CAboutDlg)
  173. // No message handlers
  174. //}}AFX_MSG_MAP
  175. END_MESSAGE_MAP()
  176. // App command to run the dialog
  177. void CCChatServerApp::OnAppAbout()
  178. {
  179. CAboutDlg aboutDlg;
  180. aboutDlg.DoModal();
  181. }
  182. /////////////////////////////////////////////////////////////////////////////
  183. // CCChatServerApp message handlers
  184. int CCChatServerApp::ExitInstance() 
  185. {
  186. // TODO: Add your specialized code here and/or call the base class
  187. Shell_NotifyIcon(NIM_DELETE,&TaskIcon);
  188. //向所有用户发送退出消息
  189.     Message msObj;
  190. msObj.iType = SYSERROR;
  191. msObj.iSubType = SERVERQUIT;
  192. CPtrList * m_pClientList = theApp.m_pClientSocketList;
  193. POSITION pos = m_pClientList ->GetHeadPosition();
  194. if(pos)
  195. {
  196. CClientSocket *  m_pClientSocket;
  197. for(int i = 0; i < m_pClientList ->GetCount(); i++)
  198. {
  199. // if(m_pClientSocket ->GetState() == HAVELOGIN)
  200. {
  201. m_pClientSocket = static_cast < CClientSocket *>(m_pClientList->GetNext(pos));
  202. m_pClientSocket ->Send(&msObj,sizeof(Message));
  203. Sleep(100);
  204. }
  205. }
  206. }
  207. //删除
  208. DeleteAllList();
  209. return CWinApp::ExitInstance();
  210. }
  211. void CCChatServerApp::DeleteAllList()
  212. {
  213. //删除
  214. POSITION pos = m_pClientSocketList ->GetHeadPosition();
  215. if(pos)
  216. {
  217. CClientSocket *  m_pClientSocket;
  218. for(int i = 0; i < m_pClientSocketList ->GetCount(); i++)
  219. {
  220. m_pClientSocket = static_cast < CClientSocket *>(m_pClientSocketList->GetNext(pos));
  221. ASSERT(m_pClientSocket != NULL);
  222. ASSERT_VALID(m_pClientSocket);
  223. delete m_pClientSocket;
  224. }
  225. }
  226. // if(m_pClientSocketList ->GetCount())
  227. //
  228. delete m_pClientSocketList;
  229. pos = m_ChatRoomList.GetHeadPosition();
  230. if(pos)
  231. {
  232. CString *  m_pRoomName;
  233. for(int i = 0; i < m_ChatRoomList .GetCount(); i++)
  234. {
  235. m_pRoomName = static_cast < CString  *>(m_ChatRoomList.GetNext(pos));
  236. ASSERT(m_pRoomName!=NULL);
  237. delete m_pRoomName;
  238. }
  239. }
  240. // m_ChatRoomList.RemoveAll();
  241. }