📄 junqi_server.cpp
字号:
//###################################################//#Created: LIP//#Description: The Server code for JunQi(four country)//#OS : linux.//#My QQ number: 13066543//#My e_mail: lip94101@btamail.net.cn//####################################################include <stdio.h>#include <stdlib.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <string.h>#include <unistd.h>#include <errno.h>#include <pthread.h>#include "junqi_type.h"#include "const_define.h"#include "cli_loadconfig.h"CONST_VAR_DEFINEint glb_prgExit;char user_name_str[32];char user_passwd_str[16];char glb_svr_ip[16];int glb_svr_port;char glb_self_ip[16];int glb_self_port;SvrUserInfo_s glb_user_list[MAX_USER_INFO_NUM+1];int glb_user_num;SvrQI_Ju_s glb_qi_ju_list[MAX_QI_JU_NUM+1];int TCP_listen_FD;int InitTCPlistenSocket();void* CliServiceThread(void *CliServiceThreadpara);int deal_sock_msg(int msgLen,char *rbuff,int user_index);int deal_cli_login(char *rbuff,int user_index);int deal_cli_logout(char *rbuff,int user_index);int deal_cli_join_qiju(char *rbuff,int user_index);int deal_cli_start_game(char *rbuff,int user_index);int deal_cli_move_qi(char *rbuff,int user_index);int deal_cli_ask_peace(char *rbuff,int user_index);int deal_cli_give_up(char *rbuff,int user_index);int deal_cli_leave_qiju(char *rbuff,int user_index);int deal_cli_ack(char *rbuff,int user_index);int delete_user(int user_index);int data_para(char *buff,int index,char *para);int decode_cmd_name(char *cmd_str);int Send_leave_qiju_to_player(int sock,int leaved_user_id,int leaved_qiju_id,int leaved_player_id);int Send_join_qiju_to_player(int sock,int joined_user_id,int joined_qiju_id,int joined_player_id);int Send_playerstart_to_player(int sock,int started_user_id,int started_qiju_id,int started_player_id);int Send_run_qi_ring_to_player(int sock,int user_id,int qiju_id,int player_id);int Send_kill_player_to_player(int sock,int killed_user_id,int killed_qiju_id,int killed_player_id);int Send_gameover_to_player(int sock,int qiju_id);int Send_move_qi_to_player(int sock,int sn_s_xindex,int sn_s_yindex,int sn_d_xindex,int sn_d_yindex);int Send_del_qi_to_player(int sock,int sn_s_xindex,int sn_s_yindex);int Send_show_junqi_to_player(int sn_player,int qiju_id,int player_id);int Save_the_qi_map(int qiju_id,int player_id,char *rbuff);int Judge_eat_qi(int s_qi_value,int d_qi_value);int Exchange_x_y_forword_90(int s_x_value,int s_y_value,int &d_x_value,int &d_y_value);int Exchange_x_y_backword_90(int s_x_value,int s_y_value,int &d_x_value,int &d_y_value);int Exchange_x_y_forword_180(int s_x_value,int s_y_value,int &d_x_value,int &d_y_value);int writenTCP(int fd, void *vptr, int n);void main(){ char rbuff[1024]; char sbuff[1024]; fd_set fds; struct sockaddr_in fromAddr; int fromSize; timeval timeout; pthread_t pth_CliService; //freopen("log_junqi_server.txt", "a+", stdout); memset(glb_user_list,0,sizeof(glb_user_list)); memset(glb_qi_ju_list,0,sizeof(glb_qi_ju_list)); LoadConfig("config.txt"); if (InitTCPlistenSocket()) { printf("OK, The fd is %d\n",TCP_listen_FD); } else { printf("InitTCPlistenSocket error.\n"); exit(0); } if (pthread_create(&pth_CliService,NULL,CliServiceThread,NULL) != 0){ printf("Could not create Client Service thread.exit\n"); exit(0); } //listen for the client connect; glb_prgExit = 0; while(!glb_prgExit){ timeout.tv_sec = 0; timeout.tv_usec = 100*1000; FD_ZERO(&fds); FD_SET(TCP_listen_FD, &fds); if (select(FD_SETSIZE, &fds, 0, 0, &timeout) < 0) { perror("main loop select error:"); if (errno != EINTR) { perror("select error:"); exit(0); } continue; } if (FD_ISSET(TCP_listen_FD, &fds)) { memset(&fromAddr, 0, sizeof(fromAddr)); int tmpfd; tmpfd=0; if ((tmpfd = accept(TCP_listen_FD, (struct sockaddr*)&fromAddr, (socklen_t *)&fromSize)) < 0){ printf("Acckpt client connect error: errno=%d\n",errno); } else{ //add the tmpfd to usertable; int ifirst_noused = 0; int ifound = 0; for(int i=1;i<=MAX_USER_INFO_NUM;i++){ if(glb_user_list[i].used_flag==0){ ifirst_noused = i; } else{ if(glb_user_list[i].ip==fromAddr.sin_addr.s_addr && glb_user_list[i].user_connect_flag==USER_CONNECT_FLAG_LOSTED){ ifound = i; } } printf("The user %d usedflag=%d user_connect_flag =%d\n",i,glb_user_list[i].used_flag,glb_user_list[i].user_connect_flag); } if(ifound==0){ if(ifirst_noused!=0){ glb_user_list[ifirst_noused].used_flag=1; glb_user_list[ifirst_noused].ip=fromAddr.sin_addr.s_addr; glb_user_list[ifirst_noused].port=fromAddr.sin_port; glb_user_list[ifirst_noused].tcpFD=tmpfd; glb_user_list[ifirst_noused].lost_count=0; glb_user_list[ifirst_noused].user_connect_flag=USER_CONNECT_FLAG_CONNECTED; } else{ printf("Too many user connected.close\n"); close(tmpfd); } printf("Accept new client connect!!!!!!userindex=%d\n",ifirst_noused); } else{ if(glb_user_list[ifound].user_connect_flag==USER_CONNECT_FLAG_LOSTED){ glb_user_list[ifound].tcpFD=tmpfd; glb_user_list[ifound].lost_count=0; glb_user_list[ifound].user_connect_flag=USER_CONNECT_FLAG_RECONNECTED; } else{ printf("error user already connected!!!\n"); close(tmpfd); } printf("Accept client connect found !!!!!!userindex=%d\n",ifound); } } } } return 0;}int InitTCPlistenSocket(){ struct sockaddr_in serv_adr; struct linger linger; int opval = 1; if ( (TCP_listen_FD = socket(AF_INET, SOCK_STREAM, 6)) < 0 ){ perror("socket error\n"); return 0; } bzero((char *)&serv_adr, sizeof(serv_adr)); serv_adr.sin_family = AF_INET; //serv_adr.sin_port = htons(56789); //serv_adr.sin_addr.s_addr = inet_addr("168.168.110.16"); serv_adr.sin_port = htons(glb_svr_port); serv_adr.sin_addr.s_addr = inet_addr(glb_svr_ip); linger.l_onoff = 1; linger.l_linger = 0; if (setsockopt(TCP_listen_FD, SOL_SOCKET, SO_LINGER, (char *) &linger,sizeof(linger)) < 0) { close (TCP_listen_FD); printf ("TCP_listen_FD sockopt error: errno=%d\n",errno); return 0; } if (setsockopt(TCP_listen_FD, SOL_SOCKET, SO_REUSEADDR, &opval,sizeof(int)) < 0) { close (TCP_listen_FD); printf ("TCP_listen_FD sockopt error: errno=%d\n",errno); return 0; } if (bind(TCP_listen_FD, (struct sockaddr *)&serv_adr, sizeof(serv_adr)) < 0) { close (TCP_listen_FD); printf ("TCP_listen_FD bind error: errno=%d\n",errno); return 0; } if (listen(TCP_listen_FD, 5) < 0) { close (TCP_listen_FD); printf ("TCP_listen_FD listen error: errno=%d\n",errno); return 0; } return 1;}void* CliServiceThread(void *CliServiceThreadpara){ fd_set fds; char rbuff[1024]; timeval timeout; int msgLen; int package_len; int is_true_msg; while(!glb_prgExit){ timeout.tv_sec = 0; timeout.tv_usec = 500*1000; FD_ZERO(&fds); for(int i=1;i<=MAX_USER_INFO_NUM;i++){ if(glb_user_list[i].used_flag==1 && (glb_user_list[i].user_connect_flag>0 && glb_user_list[i].user_connect_flag<USER_CONNECT_FLAG_LOSTED) && glb_user_list[i].tcpFD>=0){ FD_SET(glb_user_list[i].tcpFD,&fds); } else if(glb_user_list[i].used_flag==1 && glb_user_list[i].user_connect_flag==USER_CONNECT_FLAG_LOSTED){ if(glb_user_list[i].lost_count>=20){ //delete this user; printf("Call the delete_user at lost timeout\n"); delete_user(i); } else{ glb_user_list[i].lost_count++; } } } if (select(FD_SETSIZE, &fds, 0, 0, &timeout) < 0) { if (errno != EINTR && errno!=EAGAIN) { perror("Socket Select error:\n"); } continue; } for(int i=1;i<=MAX_USER_INFO_NUM;i++){ if(glb_user_list[i].used_flag==1 && glb_user_list[i].tcpFD>=0){ if(FD_ISSET(glb_user_list[i].tcpFD,&fds)){ printf("@@@@@@@@@@@Read from Client tcpFD=%d:%d\n",i,glb_user_list[i].tcpFD); msgLen = 0; package_len = 0; is_true_msg = 1; if (( msgLen = read(glb_user_list[i].tcpFD, (char *)(&package_len), sizeof(int)) ) < sizeof(int)) { if(errno != EAGAIN && errno != EINTR){ perror("TCP sock read error:\n"); close(glb_user_list[i].tcpFD); glb_user_list[i].tcpFD=-1; if(glb_user_list[i].user_connect_flag!=0){ glb_user_list[i].user_connect_flag=USER_CONNECT_FLAG_LOSTED; } glb_user_list[i].lost_count=0; } continue; } package_len = ntohl(package_len); memset(rbuff, 0, sizeof(rbuff)); msgLen = 0; while ( msgLen < package_len ) { int tmpReadLen; tmpReadLen = 0; tmpReadLen = read(glb_user_list[i].tcpFD, rbuff+msgLen, package_len-msgLen); if ( tmpReadLen < 0 ){ perror("TCP sock read error 2:\n"); close(glb_user_list[i].tcpFD); glb_user_list[i].tcpFD=-1; if(glb_user_list[i].user_connect_flag!=0){ glb_user_list[i].user_connect_flag=USER_CONNECT_FLAG_LOSTED; } glb_user_list[i].lost_count=0; is_true_msg = 0; break; } msgLen += tmpReadLen; } printf("Read msg=[%s] is_true_msg=%d\n",rbuff,is_true_msg); if(is_true_msg==1 && msgLen>0) deal_sock_msg(msgLen,rbuff,i); } } } } return NULL;}int deal_sock_msg(int msgLen,char *rbuff,int user_index){ char para[128]; int itmp_rtn; int iret; int cmd_name; memset(para,0,128); iret = data_para(rbuff,1,para); if(iret == 0){ cmd_name=decode_cmd_name(para); switch(cmd_name){ case CMD_CLI_LOGIN: deal_cli_login(rbuff,user_index); break; case CMD_CLI_LOGOUT: deal_cli_logout(rbuff,user_index); break; case CMD_CLI_JOIN_QIJU: deal_cli_join_qiju(rbuff,user_index); break; case CMD_CLI_START_GAME: deal_cli_start_game(rbuff,user_index); break; case CMD_CLI_MOVE_QI: itmp_rtn=deal_cli_move_qi(rbuff,user_index); if(itmp_rtn<0) printf("The deal_cli_move_qi called return -1\n"); break; case CMD_CLI_ASK_PEACE: deal_cli_ask_peace(rbuff,user_index); break; case CMD_CLI_GIVE_UP: deal_cli_give_up(rbuff,user_index); break; case CMD_CLI_LEAVE_QIJU: deal_cli_leave_qiju(rbuff,user_index); break; case CMD_ACK: deal_cli_ack(rbuff,user_index); break; default: break; } } return 0;}int deal_cli_login(char *rbuff,int user_index){ char sbuff[1024]; char para[128]; int iret; memset(para,0,sizeof(para)); iret = data_para(rbuff,4,para); if(iret == 0 && strlen(para)<8){ strcpy(glb_user_list[user_index].passwd,para); } else{ return -1; } memset(para,0,sizeof(para)); iret = data_para(rbuff,3,para); if(iret == 0 && strlen(para)<32){ strcpy(glb_user_list[user_index].username,para); } else{ return -1; } memset(para,0,sizeof(para)); iret = data_para(rbuff,2,para); if(iret == 0 ){ memset(sbuff,0,sizeof(sbuff)); strcpy(sbuff,"Ack "); strcat(sbuff,para); strcat(sbuff," C_Login OK "); memset(para,0,sizeof(para)); sprintf(para,"%d",user_index); strcat(sbuff,para); strcat(sbuff," "); } else{ return -1; } if(glb_user_list[user_index].user_connect_flag!=USER_CONNECT_FLAG_LOSTED){ glb_user_list[user_index].user_connect_flag=USER_CONNECT_FLAG_LOGINED; glb_user_list[user_index].user_state=USER_INFO_STATE_NO_QI_JU; } else{ ;//####restore } writenTCP(glb_user_list[user_index].tcpFD,sbuff,strlen(sbuff)); return 0;}int deal_cli_logout(char *rbuff,int user_index){ char para[128]; char passwd[8]; int user_id; int iret; memset(para,0,sizeof(para)); memset(passwd,0,8); iret = data_para(rbuff,4,para); if(iret == 0 && strlen(para)<8){ strcpy(passwd,para); } else{ return -1; } memset(para,0,sizeof(para)); iret = data_para(rbuff,3,para); if(iret==0){ sscanf(para,"%d",&user_id); } else{ return -1; } if(user_id==user_index && !strcmp(passwd,glb_user_list[user_index].passwd)){ //delete user; delete_user(user_index); } return 0;}int deal_cli_join_qiju(char *rbuff,int user_index){ char para[128]; char sbuff[1024]; int player_id; int qiju_id; int user_id; int tid; int iret; memset(para,0,sizeof(para)); iret = data_para(rbuff,5,para); if(iret == 0){ sscanf(para,"%d",&player_id); } else{ return -1; } memset(para,0,sizeof(para)); iret = data_para(rbuff,4,para); if(iret == 0){ sscanf(para,"%d",&qiju_id); } else{ return -1; } memset(para,0,sizeof(para)); iret = data_para(rbuff,3,para); if(iret == 0){ sscanf(para,"%d",&user_id); } else{ return -1; } memset(para,0,sizeof(para)); iret = data_para(rbuff,2,para); if(iret == 0){ sscanf(para,"%d",&tid); } else{ return -1; } char result[8]; memset(result,0,sizeof(result)); if(qiju_id<=MAX_QI_JU_NUM && qiju_id>0 && player_id<4 && player_id>=0){ if(glb_qi_ju_list[qiju_id].user_num<4 && glb_qi_ju_list[qiju_id].state!=QI_JU_STATE_START_PLAY && glb_qi_ju_list[qiju_id].user_flag[player_id]==0){ if(glb_user_list[user_index].user_state!=USER_INFO_STATE_NO_QI_JU){ if(glb_qi_ju_list[glb_user_list[user_index].qi_ju_index].state==QI_JU_STATE_START_PLAY && glb_user_list[user_index].user_state!=USER_INFO_STATE_DIED){ strcpy(result,"FAIL"); } else{ int old_qiju_id; int old_player_id; int i; old_qiju_id = glb_user_list[user_index].qi_ju_index; strcpy(result,"OK"); for(i=0;i<4;i++){ if(glb_qi_ju_list[old_qiju_id].user_index[i]==user_index && glb_qi_ju_list[old_qiju_id].user_flag[i]==1){ glb_qi_ju_list[old_qiju_id].user_index[i]=0; glb_qi_ju_list[old_qiju_id].user_flag[i]=0; glb_qi_ju_list[old_qiju_id].user_num--; old_player_id = i; } } /*for(i=0;i<4;i++){ if(glb_qi_ju_list[old_qiju_id].user_flag[i]==1){ //send leave qiju to qiju players; Send_leave_qiju_to_player(glb_user_list[glb_qi_ju_list[old_qiju_id].user_index[i]].tcpFD,user_index,old_qiju_id,old_player_id); } }*/ for(i=1;i<=MAX_USER_INFO_NUM;i++){ if(glb_user_list[i].used_flag==1 && glb_user_list[i].user_connect_flag==USER_CONNECT_FLAG_LOGINED && i!=user_index){ //send leave qiju to qiju players; Send_leave_qiju_to_player(glb_user_list[i].tcpFD,user_index,old_qiju_id,old_player_id); } } /* //send join qiju to qiju players; for(i=0;i<4;i++){ if(glb_qi_ju_list[qiju_id].user_flag[i]==1){
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -