📄 server.cpp
字号:
// Server.cpp: implementation of the CServer class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "WeiQiServer.h"
#include "Server.h"
#include "WeiQiServerDlg.h"
#include "Game.h"
#include "ListenSocket.h"
#include "ClientSocket.h"
#include "Player.h"
#include <ShlWApi.h>
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CServer::CServer(CWeiQiServerDlg* Dlg)
{
m_pDlg=Dlg;
m_pListenSocket=NULL;
m_NumOfReg=0;
m_NumOfClient=0;
m_NumOfGame=0;
}
CServer::~CServer()
{
}
BOOL CServer::FetchMsg(CClientSocket *pClientSocket)
{
TCHAR pMsg[1000];
char pTempMsg[1000];
int ByteCount;
BOOL EndFlag=FALSE;
StrCpy(pMsg,_T(""));
do
{
strcpy(pTempMsg,"");
ByteCount=pClientSocket->Receive(pTempMsg,1000); //Reveive只接收字节流
if(ByteCount>1000||ByteCount<0)
{
if(pClientSocket->m_InGame)
{
StrCpy(pMsg,_T("_QUITGAME1 "));
StrCat(pMsg,LPCTSTR(pClientSocket->m_pGame->m_GameName));
QuitGameMsg(pClientSocket,pMsg);
}
else
PlayerQuit(pClientSocket);
return FALSE;
}
else if(ByteCount<1000&&ByteCount>=0)
EndFlag=TRUE;
pTempMsg[ByteCount]=0;
StrCat(pMsg,_T(pTempMsg));
}while(!EndFlag);
pMsg[10]=0;
if(StrCmp(pMsg,_T("___LOGIN__"))==0) //"___LOGIN__"
{
pMsg[10]=_T(' ');
LogInMsg(pClientSocket,pMsg);
return TRUE;
}
if(StrCmp(pMsg,_T("__NEWUSER_"))==0) //"__NEWUSER_"
{
pMsg[10]=_T(' ');
NewUserMsg(pClientSocket,pMsg);
return TRUE;
}
if(StrCmp(pMsg,_T("__CREATE__"))==0) //"__CREATE__"
{
pMsg[10]=_T(' ');
CreateMsg(pClientSocket,pMsg);
return TRUE;
}
if(StrCmp(pMsg,_T("_JOINGAME_"))==0) //"_JOINGAME_"
{
pMsg[10]=_T(' ');
JoinMsg(pClientSocket,pMsg);
return TRUE;
}
if(StrCmp(pMsg,_T("_LISTGAME_"))==0) //"_LISTGAME_"
{
pMsg[10]=_T(' ');
ListGameMsg(pClientSocket,pMsg);
return TRUE;
}
if(StrCmp(pMsg,_T("__TOPTEN__"))==0) //"__TOPTEN__"
{
pMsg[10]=_T(' ');
TopTenMsg(pClientSocket,pMsg);
return TRUE;
}
if(StrCmp(pMsg,_T("_EXITGAME_"))==0) //"_EXITGAME_"
{
pMsg[10]=_T(' ');
ExitGameMsg(pClientSocket,pMsg);
return TRUE;
}
if(StrCmp(pMsg,_T("__CHATMSG_"))==0) //"__CHATMSG_"
{
pMsg[10]=_T(' ');
ChatMsg(pClientSocket,pMsg);
return TRUE;
}
if(StrCmp(pMsg,_T("_QUITGAME1"))==0) //"_QUITGAME1"
{
pMsg[10]=_T(' ');
QuitGameMsg(pClientSocket,pMsg);
return TRUE;
}
if(StrCmp(pMsg,_T("_QUITGAME0"))==0) //"_QUITGAME0"
{
pMsg[10]=_T(' ');
PlayerQuit(pClientSocket);
return TRUE;;
}
if(StrCmp(pMsg,_T("___PLACE__"))==0) //"___PLACE__"
{
pMsg[10]=_T(' ');
PlaceMsg(pClientSocket,pMsg);
return TRUE;
}
return FALSE;
}
void CServer::SendMsg(CClientSocket *pClientSocket, CString Msg)
{
if(pClientSocket!=NULL)
pClientSocket->Send(Msg,Msg.GetLength());
}
void CServer::StartServer()
{
if(m_Port==0)
{
MessageBox(_T("请输入服务器端口"));
return;
}
if(m_pListenSocket!=NULL)
{
MessageBox(_T("服务器已经开启"));
return;
}
m_pListenSocket=new CListenSocket(this);
if(m_pListenSocket->Create(m_Port))
{
if(!m_pListenSocket->Listen())
MessageBox(_T("服务器开启失败"));
else
{
if(LoadPlayer())
MessageBox(_T("服务器开启成功"));
else
MessageBox(_T("服务器数据出错"));
}
}
}
void CServer::ShutDownServer()
{
if(m_pListenSocket!=NULL)
{
CString Msg=_T("_SHUTDOWN_ ");
POSITION p=m_LogInList.GetHeadPosition();
int n=m_LogInList.GetCount();
CClientSocket* TempClient;
for(int i=0;i<n;i++)
{
TempClient=(CClientSocket*)m_LogInList.GetNext(p);
SendMsg(TempClient,Msg);
delete TempClient;
}
delete m_pListenSocket;
m_pListenSocket=NULL;
m_NumOfClient=0;
m_NumOfGame=0;
m_pDlg->m_ClientNum=0;
m_pDlg->m_PlayerList.ResetContent();
m_pDlg->m_GameNum=0;
m_pDlg->m_GameList.ResetContent();
SavePlayer();
m_ConnectionList.RemoveAll();
m_LogInList.RemoveAll();
m_PlayerList.RemoveAll();
m_GameList.RemoveAll();
m_Top10List.RemoveAll();
MessageBox(_T("服务器关闭成功"));
m_pDlg->UpdateData(FALSE);
}
}
BOOL CServer::LoadPlayer()
{
try
{
CFile DataFile("Server.dat",CFile::modeRead);
DataFile.SeekToBegin();
DataFile.Read(&m_NumOfReg,sizeof(m_NumOfReg));
CPlayer* TempPlayer;
for(UINT i=0;i<m_NumOfReg;i++)
{
TempPlayer=new CPlayer;
DataFile.Read(TempPlayer->m_PlayerName.GetBuffer(30),30*sizeof(TCHAR));
TempPlayer->m_PlayerName.ReleaseBuffer();
DataFile.Read(TempPlayer->m_PassWord.GetBuffer(30),30*sizeof(TCHAR));
TempPlayer->m_PassWord.ReleaseBuffer();
DataFile.Read(&(TempPlayer->m_Level),sizeof(UINT));
DataFile.Read(&(TempPlayer->m_Score),sizeof(UINT));
m_PlayerList.AddTail(TempPlayer);
}
DataFile.Close();
m_pDlg->m_RegNum=m_NumOfReg;
m_pDlg->UpdateData(FALSE);
return TRUE;
}
catch(CFileException)
{
return FALSE;
}
}
BOOL CServer::SavePlayer()
{
try
{
CFile DataFile("Server.dat",CFile::modeWrite);
DataFile.SeekToBegin();
DataFile.Write(&m_NumOfReg,sizeof(m_NumOfReg));
POSITION p=m_PlayerList.GetHeadPosition();
int n=m_PlayerList.GetCount();
CPlayer* TempPlayer;
for(int i=0;i<n;i++)
{
TempPlayer=(CPlayer*)m_PlayerList.GetNext(p);
DataFile.Write((LPCTSTR)TempPlayer->m_PlayerName,30*sizeof(TCHAR));
DataFile.Write((LPCTSTR)TempPlayer->m_PassWord,30*sizeof(TCHAR));
DataFile.Write(&(TempPlayer->m_Level),sizeof(UINT));
DataFile.Write(&(TempPlayer->m_Score),sizeof(UINT));
}
DataFile.Close();
return TRUE;
}
catch(CFileException)
{
return FALSE;
}
}
void CServer::PlayerQuit(CClientSocket *pConnectSocket)
{
POSITION p=m_LogInList.GetHeadPosition();
POSITION p1;
int n=m_LogInList.GetCount();
for(int i=0;i<n;i++)
{
p1=p;
if((CClientSocket*)m_LogInList.GetNext(p)==pConnectSocket)
{
m_LogInList.RemoveAt(p1);
SendMsg(pConnectSocket,_T("QUITGAMEOK"));
Sleep(100);
delete pConnectSocket;
m_NumOfClient--;
m_pDlg->m_ClientNum=m_NumOfClient;
m_pDlg->FlashPlayer();
m_pDlg->UpdateData(FALSE);
return;
}
}
}
void CServer::LogInMsg(CClientSocket* pClientSocket,PTSTR pMsg)
{
int i=12;
while(pMsg[i]!=_T(' ')) i++;
pMsg[i]=0;
CString TempName;
CString TempPass;
TempName=pMsg+12;
TempPass=pMsg+i+1;
//判断是否已经登录
POSITION p=m_LogInList.GetHeadPosition();
int n=m_LogInList.GetCount();
CPlayer* TempPlayer;
for(i=0;i<n;i++)
{
TempPlayer=((CClientSocket*)m_LogInList.GetNext(p))->m_pPlayer;
if(TempPlayer!=NULL)
{
if(TempPlayer->m_PlayerName==TempName)
{
SendMsg(pClientSocket,_T("_ALREADYIN"));
return;
}
}
}
//判断密码是否正确
p=m_PlayerList.GetHeadPosition();
n=m_PlayerList.GetCount();
for(i=0;i<n;i++)
{
TempPlayer=(CPlayer*)m_PlayerList.GetNext(p);
if(TempPlayer->m_PlayerName==TempName&&TempPlayer->m_PassWord==TempPass)
{
pClientSocket->m_pPlayer=TempPlayer;
CString Msg=_T("__LOGINOK_ ");
TCHAR Buf[10];
itoa(TempPlayer->m_Score,Buf,10);
Msg+=Buf;
SendMsg(pClientSocket,Msg);
m_NumOfClient++;
m_LogInList.AddTail(pClientSocket);
m_pDlg->m_ClientNum=m_NumOfClient;
m_pDlg->UpdateData(FALSE);
m_pDlg->FlashPlayer();
return;
}
}
SendMsg(pClientSocket,_T("_LOGINFAIL"));
}
void CServer::NewUserMsg(CClientSocket* pClientSocket,PTSTR pMsg)
{
CPlayer* TempPlayer=new CPlayer;
int i=12;
while(pMsg[i]!=_T(' ')) i++;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -