📄 mjgps.c
字号:
if ((baduser_fp = fopen (BADUSER_FILE, "r")) == NULL) { sprintf (msg_buf, "Cannot open file %s", BADUSER_FILE); err (msg_buf); return 1; } strcpy (from, lookup (&(player[player_id].addr))); sprintf (email, "%s@", player[player_id].username); strcat (email, from); while (fgets (msg_buf, 80, baduser_fp) != NULL) { msg_buf[strlen (msg_buf) - 1] = 0; if (strcmp (email, msg_buf) == 0 || strcmp (player[player_id].username, msg_buf) == 0) { display_msg (player_id, "你已被限制进入, 有问题请 mail 给 sywu@csie.nctu.edu.tw"); fclose (baduser_fp); return 0; } } fclose (baduser_fp); return 1;}voidwrite_record (){ char msg_buf[255]; if ((fp = fopen (RECORD_FILE, "r+b")) == NULL) { sprintf (msg_buf, "(write_record) Cannot open file!"); err (msg_buf); return; } fseek (fp, sizeof (record) * record.id, 0); fwrite (&record, sizeof (record), 1, fp); fclose (fp);}voidprint_news (int fd, char *name){ FILE *news_fp; char msg[255]; char msg_buf[255]; if ((news_fp = fopen (name, "r")) == NULL) { sprintf (msg_buf, "Cannot open file %s\n", NEWS_FILE); err (msg_buf); return; } while (fgets (msg, 80, news_fp) != NULL) { msg[strlen (msg) - 1] = 0; strcpy (msg_buf, "101"); strcat (msg_buf, msg); write_msg (fd, msg_buf); } fclose (news_fp);}voidwelcome_user (int player_id){ char msg_buf[255]; int fd; int total_num = 0; int online_num = 0; int i; struct player_record tmp_rec; fd = player[player_id].sockfd; if (strcmp (player[player_id].version, "093") < 0 || player[player_id].version[0] == 0) { write_msg (player[player_id].sockfd, "101请使用 QKMJ Ver 0.93 Beta 以上版本上线"); write_msg (player[player_id].sockfd, "010"); return; } sprintf (msg_buf, "101★★★★★ 欢迎 %s 来到QK麻将 ★★★★★", player[player_id].name); write_msg (player[player_id].sockfd, msg_buf); print_news (player[player_id].sockfd, NEWS_FILE); if (record.money < 15000 && record.game_count >= 16) { record.money = 15000; write_msg (fd, "101运气不太好是吗? 将你的金额提升为 15000, 好好加油!"); write_record (); } player[player_id].id = record.id; player[player_id].money = record.money; player[player_id].login = 2; player[player_id].note[0] = 0; if ((fp = fopen (RECORD_FILE, "rb")) == NULL) { sprintf (msg_buf, "(welcome) cannot open file\n"); err (msg_buf); } else { rewind (fp); while (!feof (fp) && fread (&tmp_rec, sizeof (tmp_rec), 1, fp)) { if (tmp_rec.name[0] != 0) total_num++; } fclose (fp); } for (i = 1; i < MAX_PLAYER; i++) { if (player[i].login == 2) online_num++; } sprintf (msg_buf, "101◇目前上线人数: %d 人 注册人数: %d 人", online_num, total_num); write_msg (player[player_id].sockfd, msg_buf); list_stat (player[player_id].sockfd, player[player_id].name); write_msg (player[player_id].sockfd, "003"); sprintf (msg_buf, "120%5d%ld", player[player_id].id, player[player_id].money); write_msg (player[player_id].sockfd, msg_buf); player[player_id].input_mode = CMD_MODE;}intfind_user_name (char *name){ int i; for (i = 1; i < MAX_PLAYER; i++) { if (strcmp (player[i].name, name) == 0) return i; } return -1;}voidgps_processing (){ int alen; int fd, nfds; int player_id; int player_num = 0; int i, j; int msg_id; int read_code; char tmp_buf[80]; char msg_buf[255]; unsigned char buf[256]; struct timeval timeout; struct hostent *hp; long time (); int id; struct timeval tm; long current_time; struct tm *tim; log_level = 0; nfds = getdtablesize (); nfds = 256; printf ("%d\n", nfds); FD_ZERO (&afds); FD_SET (gps_sockfd, &afds); bcopy ((char *) &afds, (char *) &rfds, sizeof (rfds)); tm.tv_sec = 0; tm.tv_usec = 0; /* * Waiting for connections */ for (;;) { bcopy ((char *) &afds, (char *) &rfds, sizeof (rfds)); if (select (nfds, &rfds, (fd_set *) 0, (fd_set *) 0, 0) < 0) { sprintf (msg_buf, "select: %d %s\n", errno, sys_errlist[errno]); err (msg_buf); continue; } if (FD_ISSET (gps_sockfd, &rfds)) { for (player_num = 1; player_num < MAX_PLAYER; player_num++) if (!player[player_num].login) break; if (player_num == MAX_PLAYER - 1) err ("Too many users"); player_id = player_num; alen = sizeof (player[player_num].addr); player[player_id].sockfd = accept (gps_sockfd, (struct sockaddr *) &player[player_num].addr, &alen); FD_SET (player[player_id].sockfd, &afds); fcntl (player[player_id].sockfd, F_SETFL, FNDELAY); player[player_id].login = 1; strcpy (climark, lookup (&(player[player_id].addr))); sprintf (msg_buf, "Connectted with %s\n", climark); err (msg_buf); time (¤t_time); tim = localtime (¤t_time);/* * if(tim->tm_hour>=2 && tim->tm_hour<6) * { * for(i=1;i<MAX_PLAYER;i++) * { * if(player[i].login) * { * print_news(player[i].sockfd,"opentime.lst"); * close_id(i); * } * } * } */ if (player_id > login_limit) { if (strcmp (climark, "ccsun34") != 0) { write_msg (player[player_id].sockfd, "101对不起,目前使用人数超过上限, 请稍後再进来."); print_news (player[player_id].sockfd, "server.lst"); close_id (player_id); } } } for (player_id = 1; player_id < MAX_PLAYER; player_id++) { if (player[player_id].login) if (FD_ISSET (player[player_id].sockfd, &rfds)) { /* * Processing the player's information */ read_code = read_msg (player[player_id].sockfd, buf); if (!read_code) { close_id (player_id); } else if (read_code == 1) { msg_id = convert_msg_id (player_id, buf); switch (msg_id) { case 99: /* * get username */ buf[15] = 0; strcpy (player[player_id].username, buf + 3); break; case 100: /* * check version */ *(buf + 6) = 0; strcpy (player[player_id].version, buf + 3); break; case 101: /* * user login */ buf[13] = 0; strcpy (player[player_id].name, buf + 3); for (i = 0; i < strlen (buf) - 3; i++) { if (buf[3 + i] <= 32 && buf[3 + i] != 0) { write_msg (player[player_id].sockfd, "101Invalid username!"); close_id (player_id); break; } } for (i = 1; i < MAX_PLAYER; i++) { if (player[i].login == 2 && strcmp (player[i].name, buf + 3) == 0) { write_msg (player[player_id].sockfd, "006"); goto multi_login; } } if (read_user_name (player[player_id].name)) { write_msg (player[player_id].sockfd, "002"); } else { write_msg (player[player_id].sockfd, "005"); } multi_login:; break; case 102: /* * Check password */ if (read_user_name (player[player_id].name)) { *(buf + 11) = 0; if (checkpasswd (record.password, buf + 3)) { for (i = 1; i < MAX_PLAYER; i++) { if (player[i].login == 2 && strcmp (player[i].name, player[player_id].name) == 0) { close_id (i); break; } } time (&record.last_login_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)); record.login_count++; write_record (); if (check_user (player_id)) welcome_user (player_id); else close_id (player_id); } else { write_msg (player[player_id].sockfd, "004"); } } break; case 103: /* * Create new account */ *(buf + 11) = 0; if (!add_user (player_id, player[player_id].name, buf + 3)) { close_id (player_id); break; } welcome_user (player_id); break; case 104: /* * Change password */ *(buf + 11) = 0; read_user_name (player[player_id].name); strcpy (record.password, genpasswd (buf + 3)); write_record (); break; case 2: list_player (player[player_id].sockfd); break; case 3: list_table (player[player_id].sockfd, 1); break; case 4: strcpy (player[player_id].note, buf + 3); break; case 5: list_stat (player[player_id].sockfd, buf + 3); break; case 6: who (player[player_id].sockfd, buf + 3); break; case 7: broadcast (player_id, buf + 3); break; case 8: invite (player_id, buf + 3); break; case 9: send_msg (player_id, buf + 3); break; case 10: lurker (player[player_id].sockfd); break; case 11: /* * Check for table server */ for (i = 1; i < MAX_PLAYER; i++) { if (player[i].login == 2 && player[i].serv) { /* * Find the name of table server */ if (strcmp (player[i].name, buf + 3) == 0) { if (player[i].serv >= 4) { write_msg (player[player_id].sockfd, "101此桌人数已满!"); goto full; } sprintf (msg_buf, "120%5d%ld", player[player_id].id, player[player_id].money); write_msg (player[i].sockfd, msg_buf); sprintf (msg_buf, "211%s", player[player_id].name); write_msg (player[i].sockfd, msg_buf); sprintf (msg_buf, "0110%s %d", inet_ntoa (player[i].addr.sin_addr), player[i].port); write_msg (player[player_id].sockfd, msg_buf); player[player_id].join = i; player[player_id].serv = 0; player[i].serv++; break; } } } if (i == MAX_PLAYER) write_msg (player[player_id].sockfd, "0111"); full:; break; case 12: player[player_id].port = atoi (buf + 3); if (player[player_id].join) { if (player[player[player_id].join].serv > 0) player[player[player_id].join].serv--; player[player_id].join = 0; } /* * clear all client */ for (i = 1; i < MAX_PLAYER; i++) { if (player[i].join == player_id) player[i].join = 0; } player[player_id].serv = 1; break; case 13: list_table (player[player_id].sockfd, 2); break; case 20: strcpy (msg_buf, buf + 3); *(msg_buf + 5) = 0; id = atoi (msg_buf); read_user_id (id); record.money = atol (buf + 8); record.game_count++; write_record (); for (i = 1; i < MAX_PLAYER; i++) { if (player[i].login == 2 && player[i].id == id) { player[i].money = record.money; break; } } break; case 21: /* * FIND */ find_user (player[player_id].sockfd, buf + 3); break; case 111:/* * player[player_id].serv++; */ break; case 200: close_id (player_id); break; case 202: if (strcmp (player[player_id].name, "candle") != 0) break; id = find_user_name (buf + 3); if (id >= 0) { write_msg (player[id].sockfd, "200"); close_id (id); } break; case 205: if (player[player_id].serv) { /* * clear all client */ for (i = 1; i < MAX_PLAYER; i++) { if (player[i].join == player_id) player[i].join = 0; } player[player_id].serv = 0; player[player_id].join = 0; } else if (player[player_id].join) { if (player[player[player_id].join].serv > 0) player[player[player_id].join].serv--; player[player_id].join = 0; } break; case 500: if (strcmp (player[player_id].name, "candle") == 0) shutdown_server (); break; default: sprintf (msg_buf, "### cmd=%d player_id=%d sockfd=%d ###\n", msg_id, player_id, player[player_id].sockfd); err (msg_buf); close_connection (player_id); sprintf (msg_buf, "Connection to %s error, closed it\n", lookup (&(player[player_id].addr))); err (msg_buf); break; } buf[0] = '\0'; } } } }}voidclose_id (int player_id){ char msg_buf[255]; close_connection (player_id); sprintf (msg_buf, "Connection to %s closed\n", lookup (&(player[player_id].addr))); err (msg_buf);}voidclose_connection (int player_id){ close (player[player_id].sockfd); FD_CLR (player[player_id].sockfd, &afds); if (player[player_id].join && player[player[player_id].join].serv) player[player[player_id].join].serv--; player[player_id].login = 0; player[player_id].serv = 0; player[player_id].join = 0; player[player_id].version[0] = 0; player[player_id].note[0] = 0; player[player_id].name[0] = 0; player[player_id].username[0] = 0;}voidshutdown_server (){ int i; char msg_buf[255]; for (i = 1; i < MAX_PLAYER; i++) { if (player[i].login) shutdown (player[i].sockfd, 2); } sprintf (msg_buf, "QKMJ Server shutdown\n"); err (msg_buf); exit (0);}voidcore_dump (){ err ("CORE DUMP!\n"); exit (0);}voidbus_err (){ err ("BUS ERROR!\n"); exit (0);}voidbroken_pipe (){ err ("Broken PIPE!!\n");}voidtime_out (){ timeup = 1;}char *genpasswd (char *pw){ char saltc[2]; long salt; int i, c; static char pwbuf[14]; long time (); char *crypt (); if (strlen (pw) == 0) return ""; time (&salt); salt = 9 * getpid ();#ifndef lint saltc[0] = salt & 077; saltc[1] = (salt >> 6) & 077;#endif for (i = 0; i < 2; i++) { c = saltc[i] + '.'; if (c > '9') c += 7; if (c > 'Z') c += 6; saltc[i] = c; } strcpy (pwbuf, pw); return crypt (pwbuf, saltc);}intcheckpasswd (char *passwd, char *test){ static char pwbuf[14]; char *pw; strncpy (pwbuf, test, 14); pw = crypt (pwbuf, passwd); return (!strcmp (pw, passwd));}voidmain (int argc, char **argv){ int i; /* * Set fd to be the maximum number */ getrlimit (RLIMIT_NOFILE, &fd_limit); fd_limit.rlim_cur = fd_limit.rlim_max; setrlimit (RLIMIT_NOFILE, &fd_limit); i = getdtablesize (); printf ("FD_SIZE=%d\n", i); signal (SIGSEGV, core_dump); signal (SIGBUS, bus_err); signal (SIGPIPE, broken_pipe); signal (SIGALRM, time_out); if (argc < 2) gps_port = DEFAULT_GPS_PORT; else { gps_port = atoi (argv[1]); printf ("Using port %s\n", argv[1]); } strcpy (gps_ip, DEFAULT_GPS_IP); init_socket (); init_variable (); gps_processing ();}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -