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

ICQ/即时通讯

开发平台:

Visual C++

  1. // ClientSocket.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "CChatServer.h"
  5. #include "ClientSocket.h"
  6. #include "MainFrm.h"
  7. #include "ParseMessage.h"
  8. #ifdef _DEBUG
  9. #define new DEBUG_NEW
  10. #undef THIS_FILE
  11. static char THIS_FILE[] = __FILE__;
  12. #endif
  13. /////////////////////////////////////////////////////////////////////////////
  14. // CClientSocket
  15. CClientSocket::CClientSocket():iState(NOTLOGIN)
  16. {
  17. }
  18. CClientSocket::~CClientSocket()
  19. {
  20. }
  21. // Do not edit the following lines, which are needed by ClassWizard.
  22. #if 0
  23. BEGIN_MESSAGE_MAP(CClientSocket, CSocket)
  24. //{{AFX_MSG_MAP(CClientSocket)
  25. //}}AFX_MSG_MAP
  26. END_MESSAGE_MAP()
  27. #endif // 0
  28. /////////////////////////////////////////////////////////////////////////////
  29. // CClientSocket member functions
  30. void CClientSocket::OnSend(int nErrorCode) 
  31. {
  32. // TODO: Add your specialized code here and/or call the base class
  33. CSocket::OnSend(nErrorCode);
  34. }
  35. extern CCChatServerApp theApp;
  36. void CClientSocket::OnReceive(int nErrorCode) 
  37. {
  38. CMainFrame * pFrame = static_cast <CMainFrame *>(AfxGetMainWnd());
  39. CMyTreeView * pTreeView = pFrame->GetTreeView();
  40. Message msContent;
  41. memset(&msContent,0,sizeof(msContent));
  42. //得到数据
  43. Receive(&msContent,sizeof(msContent));
  44. //处理数据
  45. //用户第一次登陆,CClientSocket中保存信息
  46. g_cs.Lock();
  47. if(msContent.iType == FIRSTLOG)// && msContent.iSubType == FIRSTTIME)
  48. {
  49. // static BOOL bFirst = TRUE;
  50. if(msContent.iSubType == FIRSTTIME)
  51. theApp.m_pClientSocketList->AddTail(this);
  52. CPtrList * m_pClientList = theApp.m_pClientSocketList;
  53. int iCount = m_pClientList->GetCount();
  54. POSITION pos = m_pClientList ->GetHeadPosition();
  55. if(pos)
  56. {  
  57. CString strUserName = msContent.strName;
  58. for(int i = 0; i < m_pClientList ->GetCount()-1; i++)
  59. {
  60. CClientSocket *m_pClientSocket = static_cast < CClientSocket *>(m_pClientList->GetNext(pos));
  61. if(m_pClientSocket ->GetUserName() == strUserName)
  62. {
  63. Message msObj;
  64. memset(&msObj,0,sizeof(Message));
  65. msObj.iType = SYSERROR;
  66. msObj.iSubType = USEREXSIT;
  67. Send(&msObj,sizeof(Message));
  68. return;
  69. }
  70. }
  71. }
  72. Message msObj;
  73. ::ZeroMemory(&msObj,sizeof(msObj));
  74. msObj.iType = USERLOG;
  75. msObj.iSubType = ROOMLIST;
  76. if(theApp.m_ChatRoomList.GetCount())
  77. {
  78. POSITION pos = theApp.m_ChatRoomList.GetHeadPosition();
  79. if(pos)
  80. {
  81. for(int i = 0 ; i < theApp.m_ChatRoomList.GetCount();i ++)
  82. {
  83. CString * m_pstrRoom = static_cast < CString *>(theApp.m_ChatRoomList.GetNext(pos));
  84. ASSERT(m_pstrRoom != NULL);
  85. int iLen = m_pstrRoom->GetLength();
  86. iLen > 20 ? iLen : 20;
  87. lstrcpy(msObj.strRoom,m_pstrRoom->GetBuffer(iLen));
  88. Send(&msObj,sizeof(msObj));
  89. Sleep(200);
  90. }
  91. }
  92. //发送所有的用户资料
  93. msObj.iType = USERLOG;
  94. msObj.iSubType = USERLIST;
  95. CPtrList * m_pClientList = theApp.m_pClientSocketList;
  96. pos = m_pClientList ->GetHeadPosition();
  97. int iCount = m_pClientList ->GetCount();
  98. if(pos && iCount > 0)
  99. {
  100. CClientSocket *  m_pClientSocket;
  101. for(int i = 0; i < iCount-1; i++)
  102. {
  103. m_pClientSocket = static_cast < CClientSocket *>(m_pClientList->GetNext(pos));
  104. CString strTemp = m_pClientSocket ->GetRoomName();
  105. int iLen = strTemp.GetLength();
  106. iLen > 20 ? 20 : iLen;
  107. lstrcpy(msObj.strRoom,strTemp.GetBuffer(iLen));
  108. strTemp.ReleaseBuffer();
  109. strTemp = m_pClientSocket ->GetUserName();
  110. iLen = strTemp.GetLength();
  111. iLen > 20 ? 20 : iLen;
  112. lstrcpy(msObj.strName,strTemp.GetBuffer(iLen));
  113. strTemp.ReleaseBuffer();
  114. Send(&msObj,sizeof(msObj));
  115. Sleep(100);
  116. }
  117. }
  118. g_cs.Unlock();
  119. }
  120. SetUserName(msContent.strName);
  121. SetState(HAVELOGIN);
  122. }
  123. if(msContent.iType == USERLOG && msContent.iSubType == USERLOGIN)
  124. {
  125. //检查用户名是否存在
  126. SetRoomName(msContent.strRoom);
  127. SetState(HAVELOGIN);
  128. }
  129. else if(msContent.iType == USERSESSION && msContent.iSubType == CHANGEROOM)
  130. {
  131. CString strNewRoom = msContent.strContent;
  132. SetRoomName(strNewRoom);
  133. }
  134. CParseMessage Parse(pTreeView,msContent);
  135. Parse.SWitchMessage();
  136. g_cs.Unlock();
  137. CSocket::OnReceive(nErrorCode);
  138. }