📄 serverfunc.cpp
字号:
// 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 + -