⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 junqi_server.cpp

📁 linux下开发的四国军旗源代码,包括客户端和服务器端
💻 CPP
📖 第 1 页 / 共 4 页
字号:
//###################################################//#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 + -