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

ICQ/即时通讯

开发平台:

Visual C++

  1. ////////////////////////////////////////////////////////////////
  2. //   //
  3. // 给用户发在线人数的函数,同时检测用户是否仍在线   //
  4. //   //
  5. //   //
  6. ////////////////////////////////////////////////////////////////
  7. #include "stdafx.h"
  8. #include "common.h"
  9. #include "msg.h"
  10. #include "Server.h"
  11. #include "MainFrm.h"
  12. #include "ServerView.h"
  13. UINT CheckOnline(LPVOID param)
  14. {
  15. CServerApp * pApp=(CServerApp*)AfxGetApp();
  16. UserOnline * pUsers=pApp->m_pUsers;
  17. CDatabase * pDatabase=&pApp->m_Database;
  18. CServerSocket * pSocket=&pApp->m_Socket;
  19. while(pApp->m_bServerStarted)
  20. {
  21. Sleep(TimerSpanServer);
  22. for(int i=0;i<pApp->m_nTotalUserNumber&&pApp->m_bServerStarted;i++)
  23. {
  24. if(!pUsers[i].State)continue;
  25. CMsg3 msg;
  26. msg.index=TOTAL_ONLINE;
  27. msg.tarIP=pUsers[i].IP;
  28. msg.nPort=pUsers[i].Port;
  29. msg.Value=pApp->m_nNumberOnline;
  30. BOOL bSu=pSocket->SendData(&msg);
  31. if(bSu)continue;
  32. pUsers[i].State=0;
  33. ::InterlockedDecrement((LPLONG)&pApp->m_nNumberOnline);
  34. CRecordset recordset(pDatabase);
  35. CString mysql;
  36. mysql.Format("select MyId from Friends where FriendId=%d",pUsers[i].Id);
  37. try
  38. {
  39. recordset.Open(AFX_DB_USE_DEFAULT_TYPE,mysql);
  40. }
  41. catch(CDBException e)
  42. {
  43. AfxMessageBox(e.m_strError);
  44. break;
  45. }
  46. CDBVariant value;
  47. CArray<DWORD,DWORD>pFriendId;
  48. while(!recordset.IsEOF())
  49. {
  50. recordset.GetFieldValue(short(0),value);
  51. pFriendId.Add(value.m_lVal);
  52. recordset.MoveNext();
  53. }
  54. recordset.Close();
  55. // 给在线的好友发OFFLINE消息
  56. CData msg1;
  57. msg1.index=OFFLINE;
  58. msg1.MyId=pUsers[i].Id;
  59. for(int j=0;j<pFriendId.GetSize()&&pApp->m_bServerStarted;j++)
  60. {
  61. int pi=pFriendId.GetAt(j)-UserIdRadix;
  62. if(pUsers[pi-1].State&&pApp->m_bServerStarted)
  63. {
  64. msg.tarIP=pUsers[pi-1].IP;
  65. msg.nPort=pUsers[pi-1].Port;
  66. pSocket->SendData(&msg1);
  67. }
  68. }
  69. }
  70. }
  71. return 0;
  72. }