⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 clientsocket.cpp

📁 QQ示例源码
💻 CPP
字号:
// 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 <CMainFrame *>(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);
	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -