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

📄 serverfunc.cpp

📁 类似于QQ的聊天工具,分为客户端和服务器端,有共享空间,能发布公告,可传输文件
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// SvrTool.cpp: implementation of the CServerFunc class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "Server.h"
#include "ServerFunc.h"
#include <winbase.h>

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CServerFunc::CServerFunc()
{

}

CServerFunc::~CServerFunc()
{

}

//用户注册(1001)
void CServerFunc::DoRegister(LPVOID Param,CString buff)
{
	tagTmpInfo* pTmp = (tagTmpInfo*)Param;
	CConn* pCn    = pTmp->m_pCn;
	
	CMsgBag        mbBag;
	tagPacketParam pp;


	tagClientSockeInfo* pUserIf;
	POSITION pos = (pTmp->m_pTmpList)->GetHeadPosition();
	for(int i = 0; i < (pTmp->m_pTmpList)->GetCount(); i++)
	{
		pUserIf = (pTmp->m_pTmpList)->GetNext(pos);
		if(pUserIf->m_sClientSocket == (pTmp->m_CurUserInfo).m_sClientSocket)
		{
			break;
		}
	}

	//注册处理
	CString strRegParam[7];
	CString strRegBuff;
	CString UserId = MakeNewId(pCn);

	/////////////////////////////////////////////////////////////////
	//提取包中参数
	mbBag.SplitDate(buff, strRegParam);
	
	/////////////////////////////////////////////////////////////////
	//设置注册返回消息
	strRegBuff = mbBag.GetPacketHead(buff);
	mbBag.ModifyOrderCode(CString("0001"), strRegBuff);
	mbBag.SetSourUserId(UserId, strRegBuff);
	mbBag.ModifyPacketLen(strRegBuff);

	/////////////////////////////////////////////////////////////////

	CString RegSql = "insert into UserInfo values ('" + UserId + "','";
	RegSql         += strRegParam[1] + "','" + strRegParam[0];
	RegSql         += "','" + strRegParam[2] + "','" + strRegParam[3];
	RegSql         += "','" + strRegParam[4] + "','" + strRegParam[5];
	RegSql         += "','" + strRegParam[6] + "')";
	
	if(pCn->ExecuteSql((_bstr_t)RegSql))
	{
	/////////////////////////////////////////////////////////////////
	//成功注册
		mbBag.SetRetStatus(CString("0001"), strRegBuff);
		
		//服务器保留注册用户信息
		tagServerSysMsg* msg = new tagServerSysMsg;
		msg->strSydMsg[0].Format("%d", pUserIf->m_sClientSocket);
		msg->strSydMsg[1] = strRegParam[1];
		msg->strSydMsg[2] = UserId;
		msg->strSydMsg[3] = pUserIf->m_strFilePort;
		msg->strSydMsg[4] = pUserIf->m_strIp;
		msg->strSydMsg[5] = "成功注册";
		PostMessage(*(pTmp->m_hDlgWnd), WM_DEALSYSMSG, (WPARAM)msg, 0); 
	}
	/////////////////////////////////////////////////////////////////
	//数据库出错
	else
	{
		mbBag.SetRetStatus(CString("0000"), strRegBuff);
	}

	/////////////////////////////////////////////////////////////////
	//服务器返回数据
	send((pTmp->m_CurUserInfo).m_sClientSocket, 
		strRegBuff.GetBuffer(0), strRegBuff.GetLength() + 1, 0);

	

}

//用户登陆(1002)
void CServerFunc::DoLoad(LPVOID Param, CString buff)
{
	tagTmpInfo* pTmp = (tagTmpInfo*)Param;
	CConn* pCn    = pTmp->m_pCn;
	
	CMsgBag        mbBag;
	tagPacketParam pp;


	tagClientSockeInfo* pUserIf;
	WaitForSingleObject(pTmp->m_hMutex, INFINITE);
	ReleaseMutex(pTmp->m_hMutex);
	POSITION pos = (pTmp->m_pTmpList)->GetHeadPosition();
	for(int i = 0; i < (pTmp->m_pTmpList)->GetCount(); i++)
	{
		pUserIf = (pTmp->m_pTmpList)->GetNext(pos);
		if(pUserIf->m_sClientSocket == (pTmp->m_CurUserInfo).m_sClientSocket)
		{
			break;
		}
	}
	ReleaseMutex(pTmp->m_hMutex);

	////////////////////
	//保存包中个参数
	CString strParam[4];
	CString strBuff;

	/////////////////////////////////////////
	//提取包中参数
	mbBag.SplitDate(buff, strParam);

	///////////////////////////////////////////////
	//设置服务器返回包
	strBuff = mbBag.GetPacketHead(buff);
	mbBag.ModifyOrderCode(CString("0002"), strBuff);
	mbBag.ModifyPacketLen(strBuff);

	///////////////////////////////////////////////////////
	//检验该帐号是否已经注册
	CString sql = "select * from UserInfo where UserId = '"
					+ strParam[0] + "'";
	CRecs rs;
	if(rs.Open(pCn->GetActiveConn(), (_variant_t)sql))
	{
		/////////////////////////
		//已注册的帐号
		if(!rs.GetRs()->adoEOF)
		{
			////////////////////////////////////////////////////////
			//从数据库中获取该帐号密码
			_variant_t pswTmp  = rs.GetRs()->GetCollect((_variant_t)2L);
			_variant_t nameTmp = rs.GetRs()->GetCollect((_variant_t)1L);
			CString strPsw  = (char*)(_bstr_t)pswTmp;
			CString strName = (char*)(_bstr_t)nameTmp;
			
			//////////////////////
			//验证密码是否正确
			if(strPsw != strParam[1])
			{
				mbBag.SetRetStatus(CString("0000"), strBuff);
			}
			else
			{

				//////////////////////////////////////////////////////////
				//检验此帐号是否已经登陆
				tagClientSockeInfo* pUserIfTemp;
				WaitForSingleObject(pTmp->m_hMutex, INFINITE);
				POSITION posTemp = (pTmp->m_pTmpList)->GetHeadPosition();
				for(int i = 0; i < (pTmp->m_pTmpList)->GetCount(); i++)
				{
					pUserIfTemp = (pTmp->m_pTmpList)->GetNext(posTemp);
					if(strParam[0] == pUserIfTemp->m_strUsrId)
					{
						mbBag.SetRetStatus(CString("0004"),strBuff);
						/////////////////////////////////////////////////////
						//服务器返回以登陆帐号信息
						send((pTmp->m_CurUserInfo).m_sClientSocket,
							strBuff.GetBuffer(0), strBuff.GetLength() + 1, 0);
						ReleaseMutex(pTmp->m_hMutex);
						return;
					}
				}

				////////////////////////////////////
				//在服务器用户链表中填写登陆用户信息
				pUserIf->m_bOnLine    = true;
				pUserIf->m_strUsrName = strName;
				pUserIf->m_strUsrId   = strParam[0];
				pUserIf->m_strFace    = strParam[2];
				pUserIf->m_strFilePort= strParam[3];
				pTmp->m_CurUserInfo   = *pUserIf;

				//服务器返回用户列表
				SendLoadUser(Param);
				
				//服务器保留注册用户信息
				tagServerSysMsg* msg = new tagServerSysMsg;
				msg->strSydMsg[0].Format("%d", pUserIf->m_sClientSocket);
				msg->strSydMsg[1] = pUserIf->m_strUsrName;
				msg->strSydMsg[2] = pUserIf->m_strUsrId;
				msg->strSydMsg[3] = pUserIf->m_strFilePort;
				msg->strSydMsg[4] = pUserIf->m_strIp;
				msg->strSydMsg[5] = "用户登陆";
				PostMessage(*(pTmp->m_hDlgWnd), WM_DEALSYSMSG, (WPARAM)msg, 0);
				
				/////////////////////////////////////////////////////////////////
				//服务器返回登陆成功数据
				send((pTmp->m_CurUserInfo).m_sClientSocket, strBuff.GetBuffer(0),
					strBuff.GetLength() + 1, 0);
				return;
			}
		}
		///////////////////////////////
		//未注册帐号
		else
		{
			mbBag.SetRetStatus(CString("0002"), strBuff);
		}
	}
	///////////////////////////////////////
	//数据库出错
	else
	{
		mbBag.SetRetStatus(CString("0003"), strBuff);
	}

	/////////////////////////////////////////////////////////////////
	//服务器返回登陆失败数据
	send((pTmp->m_CurUserInfo).m_sClientSocket, strBuff.GetBuffer(0),
		strBuff.GetLength() + 1, 0);
	
	
}


//用户对聊(1005)
void CServerFunc::DoChat(LPVOID Param,CString buff)
{
	tagTmpInfo* pTmp = (tagTmpInfo*)Param;
	CMsgBag        mbBag;

	tagClientSockeInfo* pUserIf;

	WaitForSingleObject(pTmp->m_hMutex, INFINITE);
	POSITION pos = (pTmp->m_pTmpList)->GetHeadPosition();
	for(int i = 0; i < (pTmp->m_pTmpList)->GetCount(); i++)
	{
		pUserIf = (pTmp->m_pTmpList)->GetNext(pos);
		if(pUserIf->m_sClientSocket == (pTmp->m_CurUserInfo).m_sClientSocket)
		{
			break;
		}
	}
	ReleaseMutex(pTmp->m_hMutex);

	CString strChatBuff = buff;
	///////////////////////////////////////////////
	//服务器直接修改命令号返回给sento的人
	//	m_pClntSockList

	CString strSendtoId;
	mbBag.ModifyOrderCode(CString("9005"), strChatBuff);
	strSendtoId = mbBag.GetDesUserId(strChatBuff);
	mbBag.SetSourUserId(pUserIf->m_strUsrId, strChatBuff);
	mbBag.ModifyPacketLen(strChatBuff);
	
	/////////////////////////////////////////////////////////////////////////
	//在服务器用户链表中查找sento的用户
	tagClientSockeInfo* pSendtoClient;
	WaitForSingleObject(pTmp->m_hMutex, INFINITE);
	pos = (pTmp->m_pTmpList)->GetHeadPosition();
	for(i = 0; i < (pTmp->m_pTmpList)->GetCount(); i++)
	{
		pSendtoClient = (pTmp->m_pTmpList)->GetNext(pos);
		if(pSendtoClient->m_strUsrId == strSendtoId)
		{
			break;
		}
	}
	ReleaseMutex(pTmp->m_hMutex);
	send(pSendtoClient->m_sClientSocket, strChatBuff.GetBuffer(0),
		strChatBuff.GetLength() + 1, 0);				
}


//共享文件信息查询(1009)
void CServerFunc::DoShareFile(LPVOID Param, CString buff, bool bStatus)
{
	tagTmpInfo* pTmp = (tagTmpInfo*)Param;
	CConn* pCn       = pTmp->m_pCn;
	
	CMsgBag        mbBag;
	tagPacketParam pp;


	tagClientSockeInfo* pUserIf;
	WaitForSingleObject(pTmp->m_hMutex, INFINITE);
	POSITION pos = (pTmp->m_pTmpList)->GetHeadPosition();
	for(int i = 0; i < (pTmp->m_pTmpList)->GetCount(); i++)
	{
		pUserIf = (pTmp->m_pTmpList)->GetNext(pos);
		if(pUserIf->m_sClientSocket == (pTmp->m_CurUserInfo).m_sClientSocket)
		{
			break;
		}
	}
	ReleaseMutex(pTmp->m_hMutex);

	CString retBuf = buff;
	CRecs rs;
	
	/////////////////////////////////////////////////////////////////////////
	//查询数据库
	CString sql;
	if(bStatus)//个人
	{
		sql = "select * from FileShare where IsPersonal = 1 and FileOwner = '"
				+ pUserIf->m_strUsrId + "'";

⌨️ 快捷键说明

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