Server.cpp
上传用户:guangzhiyw
上传日期:2007-01-09
资源大小:495k
文件大小:10k
源码类别:

ICQ/即时通讯

开发平台:

Visual C++

  1. // Server.cpp : Defines the class behaviors for the application.
  2. //
  3. #include "stdafx.h"
  4. #include "Server.h"
  5. #include "MainFrm.h"
  6. #include "ServerDoc.h"
  7. #include "ServerView.h"
  8. #include "msg.h"
  9. #include "setupdlg.h"
  10. #ifdef _DEBUG
  11. #define new DEBUG_NEW
  12. #undef THIS_FILE
  13. static char THIS_FILE[] = __FILE__;
  14. #endif
  15. /////////////////////////////////////////////////////////////////////////////
  16. // CServerApp
  17. BEGIN_MESSAGE_MAP(CServerApp, CWinApp)
  18. //{{AFX_MSG_MAP(CServerApp)
  19. ON_COMMAND(ID_APP_ABOUT, OnAppAbout)
  20. ON_COMMAND(ID_SETUP_SERVER, OnSetupServer)
  21. ON_COMMAND(ID_START_SERVER, OnStartServer)
  22. ON_UPDATE_COMMAND_UI(ID_START_SERVER, OnUpdateStartServer)
  23. ON_COMMAND(ID_USER_ONLINE, OnUserOnline)
  24. ON_COMMAND(ID_CLOSE_SERVER, OnCloseServer)
  25. ON_UPDATE_COMMAND_UI(ID_CLOSE_SERVER, OnUpdateCloseServer)
  26. ON_COMMAND(ID_APP_EXIT, OnAppExit)
  27. ON_UPDATE_COMMAND_UI(ID_USER_ONLINE, OnUpdateUserOnline)
  28. //}}AFX_MSG_MAP
  29. // Standard file based document commands
  30. ON_COMMAND(ID_FILE_NEW, CWinApp::OnFileNew)
  31. ON_COMMAND(ID_FILE_OPEN, CWinApp::OnFileOpen)
  32. END_MESSAGE_MAP()
  33. /////////////////////////////////////////////////////////////////////////////
  34. // CServerApp construction
  35. CServerApp::CServerApp()
  36. {
  37. // TODO: add construction code here,
  38. // Place all significant initialization in InitInstance
  39. m_bServerStarted=FALSE;
  40. m_nRecvMsg=0;
  41. m_nNumberOnline=0;
  42. m_nMaxUserId=0;
  43. m_pUsers=NULL;
  44. }
  45. /////////////////////////////////////////////////////////////////////////////
  46. // The one and only CServerApp object
  47. CServerApp theApp;
  48. /////////////////////////////////////////////////////////////////////////////
  49. // CServerApp initialization
  50. BOOL CServerApp::InitInstance()
  51. {
  52. // Standard initialization
  53. // If you are not using these features and wish to reduce the size
  54. //  of your final executable, you should remove from the following
  55. //  the specific initialization routines you do not need.
  56. #ifdef _AFXDLL
  57. Enable3dControls(); // Call this when using MFC in a shared DLL
  58. #else
  59. Enable3dControlsStatic(); // Call this when linking to MFC statically
  60. #endif
  61. // Change the registry key under which our settings are stored.
  62. // TODO: You should modify this string to be something appropriate
  63. // such as the name of your company or organization.
  64. SetRegistryKey(_T("Local AppWizard-Generated Applications"));
  65. LoadStdProfileSettings(0);  // Load standard INI file options (including MRU)
  66. LoadMyProfileSettings();
  67. if (!AfxSocketInit())
  68. {
  69. AfxMessageBox("初始化Socket出错");
  70. return FALSE;
  71. }
  72. CSingleDocTemplate* pDocTemplate;
  73. pDocTemplate = new CSingleDocTemplate(
  74. IDR_MAINFRAME,
  75. RUNTIME_CLASS(CServerDoc),
  76. RUNTIME_CLASS(CMainFrame),       // main SDI frame window
  77. RUNTIME_CLASS(CServerView));
  78. AddDocTemplate(pDocTemplate);
  79. // Parse command line for standard shell commands, DDE, file open
  80. CCommandLineInfo cmdInfo;
  81. ParseCommandLine(cmdInfo);
  82. // Dispatch commands specified on the command line
  83. if (!ProcessShellCommand(cmdInfo))
  84. return FALSE;
  85. char name[20];
  86. hostent * hostinfo=NULL;
  87. if(gethostname(name,sizeof(name)) == 0)
  88. {
  89. hostinfo = gethostbyname(name);
  90. if(hostinfo!= NULL)
  91. {
  92. m_strLocalIP= inet_ntoa (*(struct in_addr *)*hostinfo->h_addr_list);
  93. }
  94. }
  95. // The one and only window has been initialized, so show and update it.
  96. m_pMainWnd->ShowWindow(SW_SHOW);
  97. m_pMainWnd->UpdateWindow();
  98. return TRUE;
  99. }
  100. /////////////////////////////////////////////////////////////////////////////
  101. // CAboutDlg dialog used for App About
  102. class CAboutDlg : public CDialog
  103. {
  104. public:
  105. CAboutDlg();
  106. // Dialog Data
  107. //{{AFX_DATA(CAboutDlg)
  108. enum { IDD = IDD_ABOUTBOX };
  109. //}}AFX_DATA
  110. // ClassWizard generated virtual function overrides
  111. //{{AFX_VIRTUAL(CAboutDlg)
  112. protected:
  113. virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
  114. //}}AFX_VIRTUAL
  115. // Implementation
  116. protected:
  117. //{{AFX_MSG(CAboutDlg)
  118. // No message handlers
  119. //}}AFX_MSG
  120. DECLARE_MESSAGE_MAP()
  121. };
  122. CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
  123. {
  124. //{{AFX_DATA_INIT(CAboutDlg)
  125. //}}AFX_DATA_INIT
  126. }
  127. void CAboutDlg::DoDataExchange(CDataExchange* pDX)
  128. {
  129. CDialog::DoDataExchange(pDX);
  130. //{{AFX_DATA_MAP(CAboutDlg)
  131. //}}AFX_DATA_MAP
  132. }
  133. BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
  134. //{{AFX_MSG_MAP(CAboutDlg)
  135. // No message handlers
  136. //}}AFX_MSG_MAP
  137. END_MESSAGE_MAP()
  138. // App command to run the dialog
  139. void CServerApp::OnAppAbout()
  140. {
  141. CAboutDlg aboutDlg;
  142. aboutDlg.DoModal();
  143. }
  144. /////////////////////////////////////////////////////////////////////////////
  145. // CServerApp message handlers
  146. void CServerApp::OnSetupServer() 
  147. {
  148. CSetupDlg dlg;
  149. //dlg.m_strIP=
  150. dlg.m_strUid=m_strDataSUID;
  151. dlg.m_strPwd=m_strDataSPwd;
  152. dlg.m_strDS=m_strDataSource;
  153. dlg.m_uSendNum=m_nSendNum;
  154. dlg.m_strBroadcastPwd=m_strBroadcastPwd;
  155. CString str;
  156. for(int i=0;i<m_anPort.GetSize();i++)
  157. {
  158. str.Format("%d",m_anPort.GetAt(i));
  159. dlg.m_aStr.Add(str);
  160. }
  161. dlg.DoModal();
  162. }
  163. void CServerApp::OnStartServer() 
  164. {
  165. if(m_bServerStarted)return;
  166. m_pUsers=NULL;
  167. m_pUsers=new UserOnline[MaxUserNumber];
  168. for(int i=0;i<MaxUserNumber;i++)
  169. {
  170. m_pUsers[i].CanbeAdd=0;
  171. m_pUsers[i].Id=0;
  172. m_pUsers[i].IP=0;
  173. m_pUsers[i].PhotoId=0;
  174. m_pUsers[i].Port=0;
  175. m_pUsers[i].State=0;
  176. }
  177. try
  178. {
  179. m_Database.OpenEx(m_sConnectString);
  180. }
  181. catch(CDBException e)
  182. {
  183. AfxMessageBox(e.m_strError);
  184. return;
  185. }
  186. m_nNumberOnline=0;
  187. m_nMaxUserId=0;
  188. m_nRecvMsg=0;
  189. CRecordset recordset(&m_Database);
  190. try
  191. {
  192. recordset.Open(AFX_DB_USE_DEFAULT_TYPE,"select max(id) from users");
  193. }
  194. catch(CDBException e)
  195. {
  196. AfxMessageBox(e.m_strError);
  197. return;
  198. }
  199. if(!recordset.IsEOF())
  200. {
  201. CDBVariant value; 
  202. recordset.GetFieldValue(short(0),value);
  203. m_nMaxUserId=value.m_lVal;
  204. if(m_nMaxUserId<UserIdRadix)m_nMaxUserId=UserIdRadix-1;
  205. m_nTotalUserNumber=m_nMaxUserId-UserIdRadix+1;
  206. }
  207. else
  208. {
  209. m_nMaxUserId=UserIdRadix-1;
  210. m_nTotalUserNumber=0;
  211. }
  212. recordset.Close();
  213. try
  214. {
  215. recordset.Open(AFX_DB_USE_DEFAULT_TYPE,"select id,photoid,name,department,canbeadd from users");
  216. }
  217. catch(CDBException e)
  218. {
  219. AfxMessageBox(e.m_strError);
  220. return;
  221. }
  222. CDBVariant id,photoid,beadd;
  223. int index=0;
  224. while(!recordset.IsEOF())
  225. {
  226. recordset.GetFieldValue(short(0),id);
  227. index=id.m_lVal-UserIdRadix;
  228. recordset.GetFieldValue(1,photoid);
  229. recordset.GetFieldValue(2,m_pUsers[index].Name);
  230. recordset.GetFieldValue(3,m_pUsers[index].Department);
  231. recordset.GetFieldValue(4,beadd);
  232. m_pUsers[index].Id=id.m_lVal;
  233. m_pUsers[index].PhotoId=photoid.m_lVal;
  234. m_pUsers[index].CanbeAdd=beadd.m_chVal;
  235. recordset.MoveNext();
  236. }
  237. recordset.Close();
  238. if(!m_Socket.Create(m_nSendNum,m_anPort))
  239. {
  240. AfxMessageBox("Create Socket Error!");
  241. return;
  242. }
  243. AfxBeginThread(CheckOnline,0);
  244. m_bServerStarted=TRUE;
  245. }
  246. void CServerApp::OnUpdateStartServer(CCmdUI* pCmdUI) 
  247. {
  248. pCmdUI->Enable(!m_bServerStarted);
  249. }
  250. void CServerApp::OnUserOnline() 
  251. {
  252. }
  253. void CServerApp::OnCloseServer() 
  254. {
  255. m_bServerStarted=FALSE;
  256. m_nNumberOnline=0;
  257. m_nMaxUserId=0;
  258. m_Socket.CloseListenSocket();
  259. Sleep(1000);
  260. m_Socket.CloseSendSocket();
  261. m_Database.Close();
  262. if(m_pUsers)
  263. delete[] m_pUsers;
  264. m_pUsers=NULL;
  265. }
  266. void CServerApp::OnUpdateCloseServer(CCmdUI* pCmdUI) 
  267. {
  268. pCmdUI->Enable(m_bServerStarted);
  269. }
  270. void CServerApp::OnAppExit() 
  271. {
  272. if(m_bServerStarted)
  273. {
  274. if(AfxMessageBox("服务器正处在服务状态,您真要的关闭服务并退出吗?",MB_ICONQUESTION|MB_YESNO)==IDYES)
  275. {
  276. OnCloseServer();
  277. }
  278. else
  279. return;
  280. }
  281. //Save Server setup for client user
  282. FILE * file;
  283. file=fopen("Server.ini","w");
  284. fprintf(file,"IP=%snPort=",m_strLocalIP);
  285. fprintf(file,"%d",m_anPort.GetAt(0));
  286. for(int i=1;i<m_anPort.GetSize();i++)
  287. fprintf(file,",%d",m_anPort.GetAt(i));
  288. fclose(file);
  289. CWinApp::OnAppExit();
  290. }
  291. void CServerApp::OnUpdateUserOnline(CCmdUI* pCmdUI) 
  292. {
  293. pCmdUI->Enable(m_bServerStarted);
  294. }
  295. BOOL CServerApp::LoadMyProfileSettings()
  296. {
  297. CString cfile=SETUPFILE;
  298. //GetLocal IP Address
  299. // m_strLocalIP=?;
  300. char rtemp[50];
  301. GetPrivateProfileString("数据库", "DSN",DEFAULT_DSN,rtemp,50,cfile);
  302. m_strDataSource=rtemp;
  303. GetPrivateProfileString("数据库", "UID",DEFAULT_UID,rtemp,50,cfile);
  304. m_strDataSUID=rtemp;
  305. GetPrivateProfileString("数据库", "PWD",DEFAULT_DATAS_PWD,rtemp,50,cfile);
  306. m_strDataSPwd=rtemp;
  307. m_nSendNum=::GetPrivateProfileInt("网络设置","发送端口数",DEFAULT_SEND_NUM,cfile);
  308. GetPrivateProfileString("网络设置","发送广播密码",DEFAULT_BROADCAST_PWD,rtemp,50,cfile);
  309. m_strBroadcastPwd=rtemp;
  310. char sztemp[20];
  311. GetPrivateProfileString("网络设置","接受端口",DEFAULT_RECV_PORT_STR,rtemp,50,cfile);
  312. int j=0;
  313. for(int i=0;rtemp[i];i++)
  314. {
  315. if(rtemp[i]==',')
  316. {
  317. sztemp[j]='';
  318. m_anPort.Add(atol(sztemp));
  319. j=0;
  320. }
  321. else
  322. sztemp[j++]=rtemp[i];
  323. }
  324. sztemp[j]='';
  325. m_anPort.Add(atol(sztemp));
  326. m_sConnectString.Format("DSN=%s;UID=%s;PWD=%s;",m_strDataSource,m_strDataSUID,m_strDataSPwd);
  327. return TRUE;
  328. }
  329. void CServerApp::SaveMyProfileSettings()
  330. {
  331. CString strPort,strtemp;
  332. CString cfile=SETUPFILE;
  333. for(int i=0;i<m_anPort.GetSize();i++)
  334. {
  335. if(i==0)
  336. strtemp.Format("%d",m_anPort.GetAt(i));
  337. else
  338. strtemp.Format(",%d",m_anPort.GetAt(i));
  339. strPort+=strtemp;
  340. }
  341. CString tt;
  342. tt.Format("%d",m_nSendNum);
  343. WritePrivateProfileString("数据库", "DSN",m_strDataSource,cfile);
  344. WritePrivateProfileString("数据库", "UID",m_strDataSUID,cfile);
  345. WritePrivateProfileString("数据库", "PWD",m_strDataSPwd,cfile);
  346. WritePrivateProfileString("网络设置","发送端口数",tt,cfile);
  347. WritePrivateProfileString("网络设置","发送广播密码",m_strBroadcastPwd,cfile);
  348. WritePrivateProfileString("网络设置","接受端口",strPort,cfile);
  349. }