QQ示例源码

源代码在线查看: clientsocket.cpp

软件大小: 373 K
上传用户: weizik
关键词: 源码
下载地址: 免注册下载 普通下载 VIP

相关代码

				// ClientSocket.cpp : implementation file
				//
				
				#include "stdafx.h"
				#include "CChatServer.h"
				#include "ClientSocket.h"
				#include "MainFrm.h"
				#include "ParseMessage.h"
				
				#ifdef _DEBUG
				#define new DEBUG_NEW
				#undef THIS_FILE
				static char THIS_FILE[] = __FILE__;
				#endif
				
				/////////////////////////////////////////////////////////////////////////////
				// CClientSocket
				
				CClientSocket::CClientSocket():iState(NOTLOGIN)
				{
				}
				
				CClientSocket::~CClientSocket()
				{
				}
				
				
				// Do not edit the following lines, which are needed by ClassWizard.
				#if 0
				BEGIN_MESSAGE_MAP(CClientSocket, CSocket)
				//{{AFX_MSG_MAP(CClientSocket)
				//}}AFX_MSG_MAP
				END_MESSAGE_MAP()
				#endif	// 0
				
				/////////////////////////////////////////////////////////////////////////////
				// CClientSocket member functions
				
				void CClientSocket::OnSend(int nErrorCode) 
				{
					// TODO: Add your specialized code here and/or call the base class
					
					CSocket::OnSend(nErrorCode);
				}
				extern CCChatServerApp theApp;
				void CClientSocket::OnReceive(int nErrorCode) 
				{
					
					CMainFrame * pFrame = static_cast (AfxGetMainWnd());
					CMyTreeView * pTreeView = pFrame->GetTreeView();
					
					Message msContent;
					memset(&msContent,0,sizeof(msContent));
					//得到数据
					Receive(&msContent,sizeof(msContent));
					//处理数据
					//用户第一次登陆,CClientSocket中保存信息
					g_cs.Lock();
					
					if(msContent.iType == FIRSTLOG)// && msContent.iSubType == FIRSTTIME)
					{
					//	static BOOL bFirst = TRUE;
						if(msContent.iSubType == FIRSTTIME)
							theApp.m_pClientSocketList->AddTail(this);
						CPtrList * m_pClientList = theApp.m_pClientSocketList;
						int iCount = m_pClientList->GetCount();
						POSITION pos = m_pClientList ->GetHeadPosition();
						
						if(pos)
						{	 
							CString strUserName = msContent.strName;
							for(int i = 0; i < m_pClientList ->GetCount()-1; i++)
							{
								CClientSocket *m_pClientSocket = static_cast < CClientSocket *>(m_pClientList->GetNext(pos));
								if(m_pClientSocket ->GetUserName() == strUserName)
								{
									Message msObj;
									memset(&msObj,0,sizeof(Message));
									msObj.iType = SYSERROR;
									msObj.iSubType = USEREXSIT;
									Send(&msObj,sizeof(Message));
									
									return;
								}
								
							}
							
						}
						Message msObj;
						::ZeroMemory(&msObj,sizeof(msObj));
						msObj.iType = USERLOG;
						msObj.iSubType = ROOMLIST;
						if(theApp.m_ChatRoomList.GetCount())
						{
							POSITION pos = theApp.m_ChatRoomList.GetHeadPosition();
							if(pos)
							{
								for(int i = 0 ; i < theApp.m_ChatRoomList.GetCount();i ++)
								{
									CString * m_pstrRoom = static_cast < CString *>(theApp.m_ChatRoomList.GetNext(pos));
									ASSERT(m_pstrRoom != NULL);
									int iLen = m_pstrRoom->GetLength();
									
									iLen > 20 ? iLen : 20;
									lstrcpy(msObj.strRoom,m_pstrRoom->GetBuffer(iLen));
									Send(&msObj,sizeof(msObj));
									
									Sleep(200);
									
								}
							}
							//发送所有的用户资料
							msObj.iType = USERLOG;
							msObj.iSubType = USERLIST;
							CPtrList * m_pClientList = theApp.m_pClientSocketList;
							pos = m_pClientList ->GetHeadPosition();
							int iCount = m_pClientList ->GetCount();
							if(pos && iCount > 0)
							{
								CClientSocket *  m_pClientSocket;
								for(int i = 0; i < iCount-1; i++)
								{
									m_pClientSocket = static_cast < CClientSocket *>(m_pClientList->GetNext(pos));
									CString strTemp = m_pClientSocket ->GetRoomName();
									int iLen = strTemp.GetLength();
									iLen > 20 ? 20 : iLen;
									lstrcpy(msObj.strRoom,strTemp.GetBuffer(iLen));
									strTemp.ReleaseBuffer();
									strTemp = m_pClientSocket ->GetUserName();
									iLen = strTemp.GetLength();
									iLen > 20 ? 20 : iLen;
									lstrcpy(msObj.strName,strTemp.GetBuffer(iLen));
									strTemp.ReleaseBuffer();
									Send(&msObj,sizeof(msObj));
									Sleep(100);
									
								}
							}
							
						
							g_cs.Unlock();
							
						}
						SetUserName(msContent.strName);
						SetState(HAVELOGIN);
					}
					
					if(msContent.iType == USERLOG && msContent.iSubType == USERLOGIN)
					{
						//检查用户名是否存在
						
						SetRoomName(msContent.strRoom);
						SetState(HAVELOGIN);
					}
					else if(msContent.iType == USERSESSION && msContent.iSubType == CHANGEROOM)
					{
						CString strNewRoom = msContent.strContent;
						SetRoomName(strNewRoom);
					}
					
					
					CParseMessage Parse(pTreeView,msContent);
					Parse.SWitchMessage();
					g_cs.Unlock();
					CSocket::OnReceive(nErrorCode);
					
				}
							

相关资源