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

📄 clientsocket.cpp

📁 实现了网络通信.具有类似QQ的功能,具有客户端与服务器
💻 CPP
字号:
// ClientSocket.cpp : implementation file
//

#include "stdafx.h"
#include "MyQQServer.h"
#include "ClientSocket.h"
#include "MyQQServerDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CClientSocket

CClientSocket::CClientSocket()
{
}

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
extern CMyQQServerApp theApp;
void CClientSocket::OnReceive(int nErrorCode) 
{
	CMyQQServerDlg * pWnd = static_cast <CMyQQServerDlg *>(AfxGetMainWnd());
	Message m_Message;
	memset(&m_Message,0,sizeof(m_Message));
	Receive(&m_Message,sizeof(m_Message));

	CString strUserName = m_Message.strName;
	CString strClientName = m_Message.strClientName;
	
	g_cs.Lock();
	if(m_Message.iType == FIRSTLOG)// && msContent.iSubType == FIRSTTIME)
	{	
		
		CPtrList * m_pClientList = theApp.m_pClientSocketList;
		int iCount = m_pClientList->GetCount();
		POSITION pos = m_pClientList ->GetHeadPosition();

		if(pos)
		{	 
			for(int i = 0; i < m_pClientList ->GetCount(); 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;
				}
				else
				{
					Message msObj1;
					memset(&msObj1,0,sizeof(Message));
					msObj1.iType = USERLOG;
					msObj1.iSubType = USERLOGIN;
					CString strTemp;
					strTemp = m_pClientSocket->GetUserName();
					int len = strTemp.GetLength();
					lstrcpy(msObj1.strName,strTemp.GetBuffer(len));
					msObj1.iImage = m_pClientSocket->GetImage();
					Send(&msObj1,sizeof(Message));
				}
			}
			
		}
		iCount = m_pClientList->GetCount();
		pos = m_pClientList ->GetHeadPosition();
		if(pos)
		{
			for(int i = 0; i < m_pClientList ->GetCount(); i++)
			{
				CClientSocket *m_pClientSocket = static_cast < CClientSocket *>(m_pClientList->GetNext(pos));
				m_Message.iType = USERLOG;
				m_Message.iSubType = USERLOGIN;
			    m_pClientSocket->Send(&m_Message,sizeof(Message));
											
			}
		}

		SetImage(m_Message.iImage);
		SetUserName(m_Message.strName);
		theApp.m_pClientSocketList->AddTail(this);
		CString sList;
		sList = m_Message.strName;
		pWnd->m_SendNameCtrl.AddString(sList);
		sList = sList + " 登陆了";
		pWnd->m_ClientList.InsertString(0,sList);
		
	/*	Message mssObj;
		::ZeroMemory(&mssObj,sizeof(mssObj));
		mssObj.iType = USERLOG;
		mssObj.iSubType = USERLOGIN;

		m_pClientList = theApp.m_pClientSocketList;
		pos = m_pClientList ->GetHeadPosition();
		iCount = m_pClientList ->GetCount();
		if(pos && iCount > 0)
		{
			CClientSocket *  m_pClientSocket;
			for(int i = 0; i < iCount; i++)
			{
				m_pClientSocket = static_cast < CClientSocket *>(m_pClientList->GetNext(pos));

				CString strTemp = m_pClientSocket ->GetUserName();
			//	CString strTemp = strUserName;
				int iLen = strTemp.GetLength();
				iLen > 20 ? 20 : iLen;
				lstrcpy(mssObj.strName,strTemp.GetBuffer(iLen));
				strTemp.ReleaseBuffer();
				Send(&mssObj,sizeof(mssObj));
				Sleep(100);
				
			}
		}
		
		g_cs.Unlock();
		SetUserName(m_Message.strName);
	*/
	}
	else
	{
		if(m_Message.iType == USERSESSION)
		{
			if(m_Message.iSubType == SAYINPRIVATE)
			{
				CPtrList * m_pClientList = theApp.m_pClientSocketList;
				int iCount = m_pClientList->GetCount();
				POSITION pos = m_pClientList ->GetHeadPosition();
				if(pos)
				{	for(int i = 0; i < m_pClientList ->GetCount(); i++)
					{
						CClientSocket *m_pClientSocket = static_cast < CClientSocket *>(m_pClientList->GetNext(pos));
						CString strName = m_pClientSocket ->GetUserName();
						if(strName == strClientName )
						{
							m_pClientSocket->Send(&m_Message,sizeof(Message));
							CString strOut;
							strOut.Format("%d %d %s\n",m_Message.iType,m_Message.iSubType,m_Message.strName);
							TRACE0(strOut);
							
							g_cs.Unlock();
							return;
						}
						
					}
				}
			}
			if(m_Message.iSubType == USERQUIT)
			{
				g_cs.Lock();
			
				CPtrList * m_pClientList = theApp.m_pClientSocketList;
				int iCount = m_pClientList->GetCount();
				POSITION pos = m_pClientList ->GetHeadPosition();
				POSITION tempos = pos;
				if(pos)
				{	 
					for(int i = 0; i < m_pClientList ->GetCount(); i++)
					{
						tempos = pos;
						CClientSocket *m_pClientSocket = static_cast < CClientSocket *>(m_pClientList->GetNext(pos));
						if(m_pClientSocket ->GetUserName() == strUserName)
						{
							m_pClientSocket ->ShutDown();
							m_pClientSocket ->Close();
							delete m_pClientSocket;
							m_pClientList->RemoveAt(tempos);
							pWnd->m_ClientList.InsertString(0,strUserName+"退出了");
							for(int j=0 ;j<pWnd->m_SendNameCtrl.GetCount();j++)
							{
								CString strName;
								pWnd->m_SendNameCtrl.GetLBText(j,strName);
								if(strName == strUserName)
								{
									pWnd->m_SendNameCtrl.DeleteString(j);
									break;
								}
							}
							break;
						}
						
					}
				}
					
				m_Message.iType = USERLOG;
				m_Message.iSubType = USERLOGOUT;					
			
				m_pClientList = theApp.m_pClientSocketList;
				pos = m_pClientList ->GetHeadPosition();
				if(pos)
				{
					CClientSocket *  m_pClientSocket;
					for(int i = 0; i < m_pClientList ->GetCount(); i++)
					{
						m_pClientSocket = static_cast < CClientSocket *>(m_pClientList->GetNext(pos));
						m_pClientSocket ->Send(&m_Message,sizeof(Message));
						
						Sleep(100);
						
					}
				}
				g_cs.Unlock();
			}
		}

	}

	
	
	CSocket::OnReceive(nErrorCode);
}

void CClientSocket::SetUserName(CString sName)
{
	m_UserName = sName;
}

CString CClientSocket::GetUserName()
{
	return m_UserName;
}

void CClientSocket::SetImage(int image)
{
	m_image = image;
}

int CClientSocket::GetImage()
{
	return m_image;
}

⌨️ 快捷键说明

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