?? gameserver.cpp
字號:
// Declaration of class CGameServer
// Author: ShiXingdong
// Last modify: Jun 2nd, 2002
#include <memory.h>
#include "global.h"
#include "GameServer.h"
#include "UserInfo.h"
#include "UserManager.h"
#include "GameManager.h"
#include <winsock2.h>
#include <string>
using namespace std;
static CUserManager UserManager; //用戶管理器
static CGameManager GameManager; //游戲管理器
bool g_RecepFunc(SOCKET sct) //用來響應客戶端請求的函數
{
int OpNum,length,result,RoomNum;
unsigned int UserID=(unsigned int)sct;
ACTION action;
char UserName[256];
CUserInfo user;
GAMERESULT gameresult;
recv(sct,(char*)&OpNum,4,0); //得到用戶請求的代號
switch(OpNum)
{
case QUERY_USERS: //查詢用戶信息
length=UserManager.GetUserCount() * sizeof(CUserInfo);
send(sct,(char*)&length,4,0);
send(sct,(const char*)UserManager.GetAllUser(),length,0);
break;
case ENTER_ROOM: //進入游戲室
if(recv(sct,(char*)&RoomNum,4,0)==SOCKET_ERROR)
break;
result=GameManager.AddUser(UserID,RoomNum)&&UserManager.SetRoomNum(UserID,RoomNum)?OK:FAILED;
send(sct,(char*)&result,4,0);
break;
case EXIT_ROOM: //退出游戲室
result=GameManager.DeleteUser(UserID)&&UserManager.SetRoomNum(UserID,0)?OK:FAILED;
send(sct,(char*)&result,4,0);
break;
case USER_ACTION: //用戶作出動作
if(recv(sct,(char*)&length,4,0)==SOCKET_ERROR)
break;
if(recv(sct,(char*)&action,length,0)==SOCKET_ERROR)
break;
if( !GameManager.IsReady(UserID) ||
GameManager.GetNextPlayerID(UserID)!=UserID)
{
gameresult.GameEnd=false;
gameresult.NextPlayerID=GameManager.GetNextPlayerID(UserID);
result=FAILED;
}
else
{
action.UserID=UserID;
gameresult=GameManager.UserPlay(action);
result=OK;
}
send(sct,(char*)&result,4,0);
length=225;
send(sct,(char*)&length,4,0);
send(sct,GameManager.GetGameInfo(UserID),length,0);
if(gameresult.GameEnd)
GameManager.RestartGame(UserID);
break;
case QUERY_BOARD: //查詢棋盤信息
length=225;
send(sct,(char*)&length,4,0);
send(sct,GameManager.GetGameInfo(UserID),length,0);
break;
case REGISTER_USER: //注冊用戶
if(recv(sct,(char*)&length,4,0)==SOCKET_ERROR)
break;
if(recv(sct,(char*)UserName,length,0)==SOCKET_ERROR)
break;
UserName[length]='\0';
user.SetID(UserID);
user.SetName(UserName);
user.SetIP("Unknown");
result=UserManager.AddUser(user)?OK:FAILED;
send(sct,(char*)&result,4,0);
break;
case LOGOUT: //注銷用戶
UserManager.DeleteUser(UserID);
}
return(true);
}
bool CGameServer::IsOK() const
{
return(CTCPServer::IsOK());
}
bool CGameServer::TurnOn()
{
return(CTCPServer::TurnOn());
}
bool CGameServer::TurnOff()
{
return(CTCPServer::TurnOff());
}
string CGameServer::GetServerIP()
{
return(GetIPAddr());
}
CGameServer::CGameServer(unsigned short nPortNum):CTCPServer(nPortNum)
{
SetReceptionist(g_RecepFunc); //設置相應用戶請求的函數
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -