📄 mjgps.c
字号:
/* * Server */#include <stdio.h>#include <signal.h>#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <sys/time.h>#include <sys/stat.h>#include <sys/resource.h>#include <string.h>#include <netdb.h>#include <sys/errno.h>#include <termio.h>#include <fcntl.h>#include <sys/param.h>#include <sys/file.h>#include <pwd.h>#include <ctype.h>#include <unistd.h>#include "mjgps.h"/* * Global variables */int timeup = 0;extern int errno;fd_set rfds, afds;int login_limit;char gps_ip[20];int gps_port;int log_level;char number_map[20][5]={"0", "1", "2", "3", "4", "5", "6", "7", "8", "9"};int gps_sockfd;char climark[30];struct player_info player[MAX_PLAYER];struct player_record record;struct record_index_type record_index;FILE *fp, *log_fp;struct ask_mode_info ask;struct rlimit fd_limit;interr (char *errmsg){/* if ((log_fp = fopen (LOG_FILE, "a")) == NULL) { printf ("Cannot open logfile\n"); return -1; } printf ("%s", errmsg); if (log_level == 0) fprintf (log_fp, "%s", errmsg); log_level = 0; fclose (log_fp);*/ }intread_msg (int fd, char *msg){ int n; char msg_buf[255]; int read_code; n = 0; if (Check_for_data (fd) == 0) { err ("WRONG READ\n"); return 2; } timeup = 0; alarm (3); do { recheck:; read_code = read (fd, msg, 1); if (read_code == -1) { if (errno != EWOULDBLOCK) { alarm (0); return 0; } else if (timeup) { alarm (0); err ("TIME UP!\n"); return 0; } else goto recheck; } else if (read_code == 0) { alarm (0); return 0; } else { n++; } if (n > 79) { alarm (0); return 0; } } while (*msg++ != '\0'); alarm (0); return 1;/* * n=read(fd,msg_buf,80); * printf("-%d- ",n); * if(n<=0) * return 0; * else * { * printf("(%d)",strlen(msg_buf)); * msg_buf[n]=0; * printf("%d %d %s\n",n,strlen(msg_buf),msg_buf); * strcpy(msg,msg_buf); * return 1; * } */}voidwrite_msg (int fd, char *msg){ int n; n = strlen (msg); if (write (fd, msg, n) < 0) { close (fd); FD_CLR (fd, &afds); } if (write (fd, msg + n, 1) < 0) { close (fd); FD_CLR (fd, &afds); }}voiddisplay_msg (int player_id, char *msg){ char msg_buf[255]; sprintf (msg_buf, "101%s", msg); write_msg (player[player_id].sockfd, msg_buf);}intCheck_for_data (int fd)/* * Checks the socket descriptor fd to see if any incoming data has * arrived. If yes, then returns 1. If no, then returns 0. * If an error, returns -1 and stores the error message in socket_error. */{ int status; /* return code from Select call. */ fd_set wait_set; /* A set representing the connections that * have been established. */ struct timeval tm; /* A timelimit of zero for polling for new * connections. */ FD_ZERO (&wait_set); FD_SET (fd, &wait_set); tm.tv_sec = 0; tm.tv_usec = 0; status = select (FD_SETSIZE, &wait_set, (fd_set *) 0, (fd_set *) 0, &tm);/* * if (status < 0) * sprintf (socket_error, "Error in select: %s", sys_errlist[errno]); */ return (status);}intconvert_msg_id (int player_id, char *msg){ int i; char msg_buf[255]; if (strlen (msg) < 3) { sprintf (msg_buf, "Error msg: %s", msg); err (msg_buf); return 0; } for (i = 0; i < 3; i++) if (msg[i] < '0' || msg[i] > '9') { sprintf (msg_buf, "%d", msg[i]); err (msg_buf); } return (msg[0] - '0') * 100 + (msg[1] - '0') * 10 + (msg[2] - '0');}voidlist_player (int fd){ int i; char msg_buf[255]; int total_num = 0; write_msg (fd, "101------------- 目前上线使用者 ---------------"); strcpy (msg_buf, "101"); for (i = 1; i < MAX_PLAYER; i++) { if (player[i].login == 2) { total_num++; if ((strlen (msg_buf) + strlen (player[i].name)) > 50) { write_msg (fd, msg_buf); strcpy (msg_buf, "101"); } strcat (msg_buf, player[i].name); strcat (msg_buf, " "); } } if (strlen (msg_buf) > 4) write_msg (fd, msg_buf); write_msg (fd, "101--------------------------------------------------"); sprintf (msg_buf, "101共 %d 人", total_num); write_msg (fd, msg_buf);}voidlist_table (int fd, int mode){ int i; char msg_buf[255]; int total_num = 0; write_msg (fd, "101 桌长 人数 附注"); write_msg (fd, "101--------------------------------------------------"); for (i = 1; i < MAX_PLAYER; i++) { if (player[i].login && player[i].serv > 0) { if (player[i].serv > 4) { if (player[i].serv == 5) err ("SERV=5\n"); else { err ("LIST TABLE ERROR!"); sprintf (msg_buf, "serv=%d\n", player[i].serv); close_id (i); err (msg_buf); } } if (mode == 2 && player[i].serv >= 4) continue; total_num++; sprintf (msg_buf, "101 %-10s %-4s %s" ,player[i].name, number_map[player[i].serv] ,player[i].note); write_msg (fd, msg_buf); } } write_msg (fd, "101--------------------------------------------------"); sprintf (msg_buf, "101共 %d 桌", total_num); write_msg (fd, msg_buf);}voidlist_stat (int fd, char *name){ char msg_buf[255]; char msg_buf1[255]; char order_buf[30]; int i; int total_num; int order; struct player_record tmp_rec; total_num = 0; order = 1; if (!read_user_name (name)) { write_msg (fd, "101找不到这个人!"); return; } sprintf (msg_buf, "101◇名称:%s %s", record.name, record.last_login_from); if ((fp = fopen (RECORD_FILE, "rb")) == NULL) { sprintf (msg_buf, "(stat) Cannot open file\n"); err (msg_buf); return; } rewind (fp); if (record.game_count >= 16) while (!feof (fp) && fread (&tmp_rec, sizeof (tmp_rec), 1, fp)) { if (tmp_rec.name[0] != 0 && tmp_rec.game_count >= 16) { total_num++; if (tmp_rec.money > record.money) order++; } } if (record.game_count < 16) strcpy (order_buf, "无"); else sprintf (order_buf, "%d/%d", order, total_num); sprintf (msg_buf1, "101◇金额:%ld 排名:%s 上线次数:%d 已玩局数:%d", record.money, order_buf, record.login_count, record.game_count); write_msg (fd, msg_buf); write_msg (fd, msg_buf1); fclose (fp);}who (fd, name) int fd; char *name;{ char msg_buf[255]; int i; int serv_id; for (i = 1; i < MAX_PLAYER; i++) if (player[i].login && player[i].serv) if (strcmp (player[i].name, name) == 0) { serv_id = i; goto found_serv; } write_msg (fd, "101找不到此桌"); return; found_serv:; sprintf (msg_buf, "101%s ", player[serv_id].name); write_msg (fd, "101---------------- 此桌使用者 ------------------"); for (i = 1; i < MAX_PLAYER; i++) if (player[i].join == serv_id) { if (strlen (msg_buf) + strlen (player[i].name) > 53) { write_msg (fd, msg_buf); strcpy (msg_buf, "101"); } strcat (msg_buf, player[i].name); strcat (msg_buf, " "); } if (strlen (msg_buf) > 4) write_msg (fd, msg_buf); write_msg (fd, "101--------------------------------------------------");}lurker (fd) int fd;{ int i, total_num = 0; char msg_buf[255]; strcpy (msg_buf, "101"); write_msg (fd, "101------------- 目前□置之使用者 ---------------"); for (i = 1; i < MAX_PLAYER; i++) if (player[i].login == 2 && (player[i].join == 0 && player[i].serv == 0)) { total_num++; if ((strlen (msg_buf) + strlen (player[i].name)) > 53) { write_msg (fd, msg_buf); strcpy (msg_buf, "101"); } strcat (msg_buf, player[i].name); strcat (msg_buf, " "); } if (strlen (msg_buf) > 4) write_msg (fd, msg_buf); write_msg (fd, "101--------------------------------------------------"); sprintf (msg_buf, "101共 %d 人", total_num); write_msg (fd, msg_buf);}find_user (fd, name) int fd; char *name;{ int i; char msg_buf[255]; int id; char *ctime (); char last_login_time[80]; id = find_user_name (name); if (id > 0) { if (player[id].login == 2) { if (player[id].join == 0 && player[id].serv == 0) { sprintf (msg_buf, "101◇%s □置中", name); write_msg (fd, msg_buf); } if (player[id].join) { sprintf (msg_buf, "101◇%s 在 %s 桌内", name, player[player[id].join].name); write_msg (fd, msg_buf); } if (player[id].serv) { sprintf (msg_buf, "101◇%s 在 %s 桌内", name, player[id].name); write_msg (fd, msg_buf); } return; } } if (!read_user_name (name)) { sprintf (msg_buf, "101◇没有 %s 这个人", name); write_msg (fd, msg_buf); } else { sprintf (msg_buf, "101◇%s 不在线上", name); write_msg (fd, msg_buf); strcpy (last_login_time, ctime (&record.last_login_time)); last_login_time[strlen (last_login_time) - 1] = 0; sprintf (msg_buf, "101◇上次连线时间: %s", last_login_time); write_msg (fd, msg_buf); }}broadcast (player_id, msg) int player_id; char *msg;{ int i; char msg_buf[255]; if (strcmp (player[player_id].name, "candle") != 0) return; for (i = 1; i < MAX_PLAYER; i++) if (player[i].login == 2) { sprintf (msg_buf, "101%s", msg); write_msg (player[i].sockfd, msg_buf); }}send_msg (player_id, msg) int player_id; char *msg;{ char *str1, *str2; int i; char msg_buf[255]; str1 = strtok (msg, " "); str2 = msg + strlen (str1) + 1; for (i = 1; i < MAX_PLAYER; i++) if (player[i].login == 2 && strcmp (player[i].name, str1) == 0) { sprintf (msg_buf, "101*%s* %s", player[player_id].name, str2); write_msg (player[i].sockfd, msg_buf); return; } write_msg (player[player_id].sockfd, "101找不到这个人");}invite (player_id, name) int player_id; char *name;{ int i; char msg_buf[255]; for (i = 1; i < MAX_PLAYER; i++) if (player[i].login == 2 && strcmp (player[i].name, name) == 0) { sprintf (msg_buf, "101%s 邀请你加入 %s", player[player_id].name, (player[player_id].join == 0) ? player[player_id].name : player[player[player_id].join].name); write_msg (player[i].sockfd, msg_buf); return; } write_msg (player[player_id].sockfd, "101找不到这个人");}init_socket (){ struct sockaddr_in serv_addr; int on = 1; /* * open a TCP socket for internet stream socket */ if ((gps_sockfd = socket (AF_INET, SOCK_STREAM, 0)) < 0) err ("Server: cannot open stream socket"); /* * bind our local address */ bzero ((char *) &serv_addr, sizeof (serv_addr)); serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = htonl (INADDR_ANY); serv_addr.sin_port = htons (gps_port); setsockopt (gps_sockfd, SOL_SOCKET, SO_REUSEADDR, (char *) &on, sizeof (on)); if (bind (gps_sockfd, (struct sockaddr *) &serv_addr, sizeof (serv_addr)) < 0) { printf ("server: cannot bind local address\n"); exit (1); } listen (gps_sockfd, 10); printf ("Listen for client...\n");}char *lookup (struct sockaddr_in *cli_addrp){ struct hostent *hp; char *hostname; hp = gethostbyaddr ((char *) &cli_addrp->sin_addr, sizeof (struct in_addr), cli_addrp->sin_family); if (hp) hostname = (char *) hp->h_name; else hostname = inet_ntoa (cli_addrp->sin_addr); return hostname;}init_variable (){ int i; login_limit = 100; for (i = 0; i < MAX_PLAYER; i++) { player[i].login = 0; player[i].serv = 0; player[i].join = 0; player[i].type = 16; player[i].note[0] = 0; player[i].username[0] = 0; }}intread_user_name (name) char *name;{ struct player_record tmp_rec; char msg_buf[255]; if ((fp = fopen (RECORD_FILE, "a+b")) == NULL) { sprintf (msg_buf, "(read_user_name) Cannot open file!\n"); err (msg_buf); return; } rewind (fp); while (!feof (fp) && fread (&tmp_rec, sizeof (tmp_rec), 1, fp)) { if (strcmp (name, tmp_rec.name) == 0) { record = tmp_rec; fclose (fp); return 1; } } fclose (fp); return 0;}intread_user_id (id) unsigned int id;{ char msg_buf[255]; if ((fp = fopen (RECORD_FILE, "a+b")) == NULL) { sprintf (msg_buf, "(read_user_id) Cannot open file!\n"); err (msg_buf); return; } rewind (fp); fseek (fp, sizeof (record) * id, 0); fread (&record, sizeof (record), 1, fp); fclose (fp);}intadd_user (int player_id, char *name, char *passwd){ long time (); struct stat status; stat (RECORD_FILE, &status); if (!read_user_name ("")) record.id = status.st_size / sizeof (record); strcpy (record.name, name); strcpy (record.password, genpasswd (passwd)); record.money = DEFAULT_MONEY; record.level = 0; record.login_count = 1; record.game_count = 0; time (&record.regist_time); record.last_login_time = record.regist_time; record.last_login_from[0] = 0; if (player[player_id].username[0] != 0) { sprintf (record.last_login_from, "%s@", player[player_id].username); } strcat (record.last_login_from, lookup (&(player[player_id].addr))); if (check_user (player_id)) { write_record (); return 1; } else return 0;}intcheck_user (int player_id){ char msg_buf[255]; char from[80]; char email[80]; FILE *baduser_fp;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -