Response::ResponseCode Server_ProtocolHandler::processSessionCommandContainer(const CommandContainer &cont, ResponseContainer &rc) { Response::ResponseCode finalResponseCode = Response::RespOk; for (int i = cont.session_command_size() - 1; i >= 0; --i) { Response::ResponseCode resp = Response::RespInvalidCommand; const SessionCommand &sc = cont.session_command(i); const int num = getPbExtension(sc); if (num != SessionCommand::PING) { // don't log ping commands if (num == SessionCommand::LOGIN) { // log login commands, but hide passwords SessionCommand debugSc(sc); debugSc.MutableExtension(Command_Login::ext)->clear_password(); logDebugMessage(QString::fromStdString(debugSc.ShortDebugString())); } else logDebugMessage(QString::fromStdString(sc.ShortDebugString())); } switch ((SessionCommand::SessionCommandType) num) { case SessionCommand::PING: resp = cmdPing(sc.GetExtension(Command_Ping::ext), rc); break; case SessionCommand::LOGIN: resp = cmdLogin(sc.GetExtension(Command_Login::ext), rc); break; case SessionCommand::MESSAGE: resp = cmdMessage(sc.GetExtension(Command_Message::ext), rc); break; case SessionCommand::GET_GAMES_OF_USER: resp = cmdGetGamesOfUser(sc.GetExtension(Command_GetGamesOfUser::ext), rc); break; case SessionCommand::GET_USER_INFO: resp = cmdGetUserInfo(sc.GetExtension(Command_GetUserInfo::ext), rc); break; case SessionCommand::LIST_ROOMS: resp = cmdListRooms(sc.GetExtension(Command_ListRooms::ext), rc); break; case SessionCommand::JOIN_ROOM: resp = cmdJoinRoom(sc.GetExtension(Command_JoinRoom::ext), rc); break; case SessionCommand::LIST_USERS: resp = cmdListUsers(sc.GetExtension(Command_ListUsers::ext), rc); break; default: resp = processExtendedSessionCommand(num, sc, rc); } if (resp != Response::RespOk) finalResponseCode = resp; } return finalResponseCode; }
/** * 创建赛局 * @param fd * @return */ int cmdGameCreate(int fd) { PkgInfo inputPkg; PkgInfo outputPkg; if(loginId == 0){ cmdLogin(fd); } CHashGameData gameData; gameData.id = loginId; gameData.playA = loginId; outputPkg.id = 2;//cmd创建战局 memcpy(&outputPkg.data, (char *) &gameData, sizeof (gameData)); send(fd, (char *) &outputPkg, sizeof (outputPkg), 0); //recv char buf[MAXBUF + 1]; recv(fd, buf, MAXBUF, 0); memcpy(&inputPkg, buf, sizeof (inputPkg)); if(inputPkg.id == 14){ struct MsgInfo msg; memset(&msg,0,sizeof(msg)); memcpy(&msg, inputPkg.data, sizeof(msg)); printf(" [server]:%s\n",msg.message); } currentGameId=loginId; loopWaitJoin(fd); cmdGamePlayHandA(fd); }
/* handle_message - 处理每个 socket 上的消息收发 */ int handle_message(int new_fd) { char buf[MAXBUF + 1]; int len; // while(1){ /* 开始处理每个新连接上的数据收发 */ bzero(buf, MAXBUF + 1); /* 接收客户端的消息 */ len = recv(new_fd, buf, MAXBUF, 0); buf[len] = 0; if (len > 0) { printf("%d接收消息成功,共%d个字节的数据\n", new_fd, len); CHashUserData userData; PkgInfo inputPkg; PkgInfo outputPkg; memcpy(&inputPkg, buf, sizeof (inputPkg)); printf("-------%d----------\n",new_fd); //cmdTest if (inputPkg.id == 1) { cmdLogin(inputPkg, outputPkg); } else if(inputPkg.id == 6){ cmdUserQuery(inputPkg,outputPkg); } else if (inputPkg.id == 15) { cmdTest(inputPkg, outputPkg); } else if (inputPkg.id == 13) { cmdLogout(inputPkg, outputPkg); } else if (inputPkg.id == 5) { cmdGameQuery(inputPkg, outputPkg); } else if (inputPkg.id == 12) { cmdQueryUserList(inputPkg, outputPkg); } else if(inputPkg.id == 2){ cmdGameCreate(inputPkg, outputPkg); }else if(inputPkg.id == 11){ cmdQueryGameList(inputPkg,outputPkg); }else if(inputPkg.id == 3){ cmdGameJoin(inputPkg,outputPkg); }else if(inputPkg.id == 4){ cmdGamePlayHand(inputPkg,outputPkg); }else { printf("cmd unknow\n"); } if (send(new_fd, (char *) &outputPkg, sizeof (outputPkg), 0) == -1) { fprintf(stderr, "Write Error:%s\n", strerror(errno)); //exit(1); } } else { if (len < 0){ printf("消息接收失败!错误代码是%d,错误信息是'%s',len:%d\n",errno, strerror(errno),len); } } // } //close(new_fd); /* 处理每个新连接上的数据收发结束 */ return len; }
/** * 加和赛局 * @param fd * @return */ int cmdGameJoin(int fd) { PkgInfo inputPkg; PkgInfo outputPkg; if(loginId == 0){ cmdLogin(fd); } cmdQueryGameList(fd);//查询在线游戏列表 printf(" please input join gameid :"); scanf("%d", &joinGameId);//输入加入游戏id CHashGameData game,gameData; game.id = joinGameId; game.playB=loginId; // int ret = cmdGameQuery(fd,joinGameId,gameData); // if(ret< 0){ // printf(" can not find game:%d\n",joinGameId); // cmdGameJoin(fd); // return 0; // } outputPkg.id = 3;//cmd加入战局 memcpy(&outputPkg.data, (char *) &game, sizeof (game)); send(fd, (char *) &outputPkg, sizeof (outputPkg), 0); //recv char buf[MAXBUF + 1]; recv(fd, buf, MAXBUF, 0); memcpy(&inputPkg, buf, sizeof (inputPkg)); if(inputPkg.id == 14){ struct MsgInfo msg; memset(&msg,0,sizeof(msg)); memcpy(&msg, inputPkg.data, sizeof(msg)); printf(" [server]:%s\n",msg.message); cmdGameJoin(fd); }else if(inputPkg.id == 3){ struct MsgInfo msg; memset(&msg,0,sizeof(msg)); memcpy(&msg, inputPkg.data, sizeof(msg)); printf(" [server]:%s\n",msg.message); } cmdGamePlayHandB(fd); }
int menuCmd(int sockfd) { char inputLine [80]; int cmdId = 0; printf("please input number(show menu:0): "); scanf("%s", inputLine); cmdId = atoi(inputLine); if (cmdId == 0){ cmdShowMenu(); }if (cmdId == 1) { cmdLogin(sockfd); } else if (cmdId == 13) { cmdLogout(sockfd); return 1; } else if (cmdId == 12) { cmdQueryUserList(sockfd); } else if (cmdId == 2) { cmdGameCreate(sockfd); } else if (cmdId == 5) { //cmdGameQuery(sockfd); } else if (cmdId == 11) { cmdQueryGameList(sockfd); } else if (cmdId == 3) { cmdGameJoin(sockfd); } else if (cmdId == 41) { cmdGamePlayHandA(sockfd); } else if (cmdId == 42) { cmdGamePlayHandB(sockfd); } else { printf("please select number from menu,thanks\n"); } return 0; // cmdLogin(sockfd); //昵称登陆 // cmdLogout(sockfd); //退出登陆 // cmdQueryUserList(sockfd); //查询在线用户列表 // cmdGameCreate(sockfd); //创建战局 // cmdQueryGameList(sockfd); //查询战局 // cmdGameJoin(sockfd); //加入战局 // cmdGamePlayHandA(sockfd); //play a:出拳 // cmdGamePlayHandB(sockfd); //play b:出拳 }
ResponseCode Server_ProtocolHandler::processCommandHelper(Command *command, CommandContainer *cont) { lastCommandTime = QDateTime::currentDateTime(); RoomCommand *roomCommand = qobject_cast<RoomCommand *>(command); if (roomCommand) { qDebug() << "received RoomCommand: roomId =" << roomCommand->getRoomId(); if (authState == PasswordWrong) return RespLoginNeeded; Server_Room *room = rooms.value(roomCommand->getRoomId(), 0); if (!room) return RespNameNotFound; switch (command->getItemId()) { case ItemId_Command_LeaveRoom: return cmdLeaveRoom(static_cast<Command_LeaveRoom *>(command), cont, room); case ItemId_Command_RoomSay: return cmdRoomSay(static_cast<Command_RoomSay *>(command), cont, room); case ItemId_Command_CreateGame: return cmdCreateGame(static_cast<Command_CreateGame *>(command), cont, room); case ItemId_Command_JoinGame: return cmdJoinGame(static_cast<Command_JoinGame *>(command), cont, room); default: return RespInvalidCommand; } } GameCommand *gameCommand = qobject_cast<GameCommand *>(command); if (gameCommand) { qDebug() << "received GameCommand: game =" << gameCommand->getGameId(); if (authState == PasswordWrong) return RespLoginNeeded; if (!games.contains(gameCommand->getGameId())) { qDebug() << "invalid game"; return RespNameNotFound; } QPair<Server_Game *, Server_Player *> gamePair = games.value(gameCommand->getGameId()); Server_Game *game = gamePair.first; Server_Player *player = gamePair.second; switch (command->getItemId()) { case ItemId_Command_DeckSelect: return cmdDeckSelect(static_cast<Command_DeckSelect *>(command), cont, game, player); case ItemId_Command_SetSideboardPlan: return cmdSetSideboardPlan(static_cast<Command_SetSideboardPlan *>(command), cont, game, player); case ItemId_Command_LeaveGame: return cmdLeaveGame(static_cast<Command_LeaveGame *>(command), cont, game, player); case ItemId_Command_ReadyStart: return cmdReadyStart(static_cast<Command_ReadyStart *>(command), cont, game, player); case ItemId_Command_Concede: return cmdConcede(static_cast<Command_Concede *>(command), cont, game, player); case ItemId_Command_Say: return cmdSay(static_cast<Command_Say *>(command), cont, game, player); case ItemId_Command_Shuffle: return cmdShuffle(static_cast<Command_Shuffle *>(command), cont, game, player); case ItemId_Command_Mulligan: return cmdMulligan(static_cast<Command_Mulligan *>(command), cont, game, player); case ItemId_Command_RollDie: return cmdRollDie(static_cast<Command_RollDie *>(command), cont, game, player); case ItemId_Command_DrawCards: return cmdDrawCards(static_cast<Command_DrawCards *>(command), cont, game, player); case ItemId_Command_MoveCard: return cmdMoveCard(static_cast<Command_MoveCard *>(command), cont, game, player); case ItemId_Command_FlipCard: return cmdFlipCard(static_cast<Command_FlipCard *>(command), cont, game, player); case ItemId_Command_AttachCard: return cmdAttachCard(static_cast<Command_AttachCard *>(command), cont, game, player); case ItemId_Command_CreateToken: return cmdCreateToken(static_cast<Command_CreateToken *>(command), cont, game, player); case ItemId_Command_CreateArrow: return cmdCreateArrow(static_cast<Command_CreateArrow *>(command), cont, game, player); case ItemId_Command_DeleteArrow: return cmdDeleteArrow(static_cast<Command_DeleteArrow *>(command), cont, game, player); case ItemId_Command_SetCardAttr: return cmdSetCardAttr(static_cast<Command_SetCardAttr *>(command), cont, game, player); case ItemId_Command_SetCardCounter: return cmdSetCardCounter(static_cast<Command_SetCardCounter *>(command), cont, game, player); case ItemId_Command_IncCardCounter: return cmdIncCardCounter(static_cast<Command_IncCardCounter *>(command), cont, game, player); case ItemId_Command_IncCounter: return cmdIncCounter(static_cast<Command_IncCounter *>(command), cont, game, player); case ItemId_Command_CreateCounter: return cmdCreateCounter(static_cast<Command_CreateCounter *>(command), cont, game, player); case ItemId_Command_SetCounter: return cmdSetCounter(static_cast<Command_SetCounter *>(command), cont, game, player); case ItemId_Command_DelCounter: return cmdDelCounter(static_cast<Command_DelCounter *>(command), cont, game, player); case ItemId_Command_NextTurn: return cmdNextTurn(static_cast<Command_NextTurn *>(command), cont, game, player); case ItemId_Command_SetActivePhase: return cmdSetActivePhase(static_cast<Command_SetActivePhase *>(command), cont, game, player); case ItemId_Command_DumpZone: return cmdDumpZone(static_cast<Command_DumpZone *>(command), cont, game, player); case ItemId_Command_StopDumpZone: return cmdStopDumpZone(static_cast<Command_StopDumpZone *>(command), cont, game, player); case ItemId_Command_RevealCards: return cmdRevealCards(static_cast<Command_RevealCards *>(command), cont, game, player); default: return RespInvalidCommand; } } AdminCommand *adminCommand = qobject_cast<AdminCommand *>(command); if (adminCommand) { qDebug() << "received AdminCommand"; if (!(userInfo->getUserLevel() & ServerInfo_User::IsAdmin)) return RespLoginNeeded; switch (command->getItemId()) { case ItemId_Command_UpdateServerMessage: return cmdUpdateServerMessage(static_cast<Command_UpdateServerMessage *>(command), cont); default: return RespInvalidCommand; } } qDebug() << "received generic Command"; switch (command->getItemId()) { case ItemId_Command_Ping: return cmdPing(static_cast<Command_Ping *>(command), cont); case ItemId_Command_Login: return cmdLogin(static_cast<Command_Login *>(command), cont); case ItemId_Command_Message: return cmdMessage(static_cast<Command_Message *>(command), cont); case ItemId_Command_DeckList: return cmdDeckList(static_cast<Command_DeckList *>(command), cont); case ItemId_Command_DeckNewDir: return cmdDeckNewDir(static_cast<Command_DeckNewDir *>(command), cont); case ItemId_Command_DeckDelDir: return cmdDeckDelDir(static_cast<Command_DeckDelDir *>(command), cont); case ItemId_Command_DeckDel: return cmdDeckDel(static_cast<Command_DeckDel *>(command), cont); case ItemId_Command_DeckUpload: return cmdDeckUpload(static_cast<Command_DeckUpload *>(command), cont); case ItemId_Command_DeckDownload: return cmdDeckDownload(static_cast<Command_DeckDownload *>(command), cont); case ItemId_Command_GetUserInfo: return cmdGetUserInfo(static_cast<Command_GetUserInfo *>(command), cont); case ItemId_Command_ListRooms: return cmdListRooms(static_cast<Command_ListRooms *>(command), cont); case ItemId_Command_JoinRoom: return cmdJoinRoom(static_cast<Command_JoinRoom *>(command), cont); case ItemId_Command_ListUsers: return cmdListUsers(static_cast<Command_ListUsers *>(command), cont); default: return RespInvalidCommand; } }