login2.c
来自「仙镜游戏源码,仅供学习!请勿用于非法应用!」· C语言 代码 · 共 341 行
C
341 行
#include <sys/types.h>#include <sys/socket.h>#include <stdio.h>#include <stdlib.h>#include <netinet/in.h>#include <sys/time.h>#include <sys/ioctl.h>#include <unistd.h>#include <signal.h>#include <fcntl.h>#include <string.h>#include <arpa/inet.h>#include "core.h"#include "mmo.h"int account_id_count = 100000;int server_num;struct mmo_char_server server[MAX_SERVERS];int server_fd[MAX_SERVERS];#define AUTH_FIFO_SIZE 256struct { int account_id,login_id1,login_id2; int delflag;} auth_fifo[AUTH_FIFO_SIZE];int auth_fifo_pos=0;struct { int account_id,sex; char userid[24],pass[24],lastlogin[24]; int logincount;} *auth_dat;int auth_num=0,auth_max=0;int mmo_auth_init(void){ FILE *fp; int i,account_id,logincount; char line[1024],userid[24],pass[24],lastlogin[24],sex; fp=fopen("account.txt","r"); auth_dat=malloc(sizeof(auth_dat[0])*256); auth_max=256; if(fp==NULL) return 0; while(fgets(line,1023,fp)!=NULL){ i=sscanf(line,"%d\t%[^\t]\t%[^\t]\t%[^\t]\t%c\t%d", &account_id,userid,pass,lastlogin,&sex,&logincount); if(i>=5){ if(auth_num>=auth_max){ auth_max+=256; auth_dat=realloc(auth_dat,sizeof(auth_dat[0])*auth_max); } auth_dat[auth_num].account_id=account_id; strncpy(auth_dat[auth_num].userid,userid,24); strncpy(auth_dat[auth_num].pass,pass,24); strncpy(auth_dat[auth_num].lastlogin,lastlogin,24); auth_dat[auth_num].sex = sex == 'S' ? 2 : sex=='M'; if(i>=6) auth_dat[auth_num].logincount=logincount; else auth_dat[auth_num].logincount=1; auth_num++; if(account_id>=account_id_count) account_id_count=account_id+1; } } fclose(fp); return 0;}void mmo_auth_sync(void){ FILE *fp; int i; fp=fopen("account.txt","w"); if(fp==NULL) return; for(i=0;i<auth_num;i++){ fprintf(fp,"%d\t%s\t%s\t%s\t%c\t%d\n",auth_dat[i].account_id, auth_dat[i].userid,auth_dat[i].pass,auth_dat[i].lastlogin, auth_dat[i].sex==2 ? 'S' : (auth_dat[i].sex ? 'M' : 'F'), auth_dat[i].logincount); } fclose(fp);}int mmo_auth( struct mmo_account* account ){ int i; struct timeval tv; char tmpstr[256]; FILE *logfp; int len,newaccount=0; len=strlen(account->userid)-2; if(account->userid[len]=='_' && (account->userid[len+1]=='F' || account->userid[len+1]=='M')){ newaccount=1; account->userid[len]=0; } gettimeofday(&tv,NULL); strftime(tmpstr,24,"%Y-%m-%d %H:%M:%S",localtime(&(tv.tv_sec))); sprintf(tmpstr+19,".%03d",(int)tv.tv_usec/1000); for(i=0;i<auth_num;i++){ if(strcmp(account->userid,auth_dat[i].userid)==0) break; } if(i!=auth_num){ if(strcmp(account->passwd,auth_dat[i].pass) || newaccount){ logfp=fopen("login.log","a"); if(logfp){ fprintf(logfp,"auth failed pass error %s %s %s %d\n",tmpstr,account->userid,account->passwd,newaccount); fclose(logfp); } return 1; } logfp=fopen("login.log","a"); if(logfp){ fprintf(logfp,"auth ok %s %s %s %d\n",tmpstr,account->userid,account->passwd,newaccount); fclose(logfp); } } else { if(newaccount==0){ logfp=fopen("login.log","a"); if(logfp){ fprintf(logfp,"auth failed no account %s %s %s %d\n",tmpstr,account->userid,account->passwd,newaccount); fclose(logfp); } return 0; } logfp=fopen("login.log","a"); if(logfp){ fprintf(logfp,"auth new %s %s %s %d\n",tmpstr,account->userid,account->passwd,newaccount); fclose(logfp); } if(auth_num>=auth_max){ auth_max+=256; auth_dat=realloc(auth_dat,sizeof(auth_dat[0])*auth_max); } auth_dat[i].account_id=account_id_count++; strncpy(auth_dat[i].userid,account->userid,24); strncpy(auth_dat[i].pass,account->passwd,24); auth_dat[i].sex=account->userid[len+1]=='M'; auth_dat[i].logincount=0; auth_num++; } account->account_id = auth_dat[i].account_id; account->login_id1 = rand(); account->login_id2 = rand(); memcpy(account->lastlogin,auth_dat[i].lastlogin,24); memcpy(auth_dat[i].lastlogin,tmpstr,24); account->sex = auth_dat[i].sex; auth_dat[i].logincount++; mmo_auth_sync(); return 100;}int parse_fromchar(int fd){ int i,id; for(id=0;id<MAX_SERVERS;id++) if(server_fd[id]==fd) break; if(id==MAX_SERVERS) session[fd]->eof=1; if(session[fd]->eof){ for(i=0;i<MAX_SERVERS;i++) if(server_fd[i]==fd) server_fd[i]=-1; close(fd); delete_session(fd); return 0; } while(RFIFOREST(fd)>=2){ switch(RFIFOW(fd,0)){ case 0x2712: if(RFIFOREST(fd)<14) return 0; for(i=0;i<AUTH_FIFO_SIZE;i++){ if(auth_fifo[i].account_id==RFIFOL(fd,2) && auth_fifo[i].login_id1==RFIFOL(fd,6) && auth_fifo[i].login_id2==RFIFOL(fd,10) && !auth_fifo[i].delflag){ auth_fifo[i].delflag=1; break; } } WFIFOW(fd,0)=0x2713; WFIFOL(fd,2)=RFIFOL(fd,2); if(i!=AUTH_FIFO_SIZE){ WFIFOB(fd,6)=0; } else { WFIFOB(fd,6)=1; } WFIFOSET(fd,7); RFIFOSKIP(fd,14); break; case 0x2714: //printf("set users %s : %d\n",server[id].name,RFIFOL(fd,2)); server[id].users=RFIFOL(fd,2); RFIFOSKIP(fd,6); break; default: close(fd); session[fd]->eof=1; return 0; } } return 0;}int parse_login(int fd){ struct mmo_account account; int result,i; if(session[fd]->eof){ for(i=0;i<MAX_SERVERS;i++) if(server_fd[i]==fd) server_fd[i]=-1; close(fd); delete_session(fd); return 0; } printf("parse_login : %d %d %d\n",fd,RFIFOREST(fd),RFIFOW(fd,0)); while(RFIFOREST(fd)>=2){ switch(RFIFOW(fd,0)){ case 0x64: if(RFIFOREST(fd)<55) return 0; { FILE *logfp=fopen("login.log","a"); if(logfp){ unsigned char *p=(unsigned char *)&session[fd]->client_addr.sin_addr; fprintf(logfp,"client connection request %s from %d.%d.%d.%d\n", RFIFOP(fd,6),p[0],p[1],p[2],p[3]); fclose(logfp); } } account.userid = RFIFOP(fd,6); account.passwd = RFIFOP(fd,30); result=mmo_auth(&account); if(result==100){ server_num=0; for(i=0;i<MAX_SERVERS;i++){ if(server_fd[i]>=0){ WFIFOL(fd,47+server_num*32) = server[i].ip; WFIFOW(fd,47+server_num*32+4) = server[i].port; memcpy(WFIFOP(fd,47+server_num*32+6), server[i].name, 20 ); WFIFOW(fd,47+server_num*32+26) = server[i].users; WFIFOW(fd,47+server_num*32+28) = 0; // maintenance WFIFOW(fd,47+server_num*32+30) = 0; // new server_num++; } } WFIFOW(fd,0)=0x69; WFIFOW(fd,2)=47+32*server_num; WFIFOL(fd,4)=account.login_id1; WFIFOL(fd,8)=account.account_id; WFIFOL(fd,12)=account.login_id2; WFIFOL(fd,16)=0; memcpy(WFIFOP(fd,20),account.lastlogin,24); WFIFOB(fd,46)=account.sex; WFIFOSET(fd,47+32*server_num); if(auth_fifo_pos>=AUTH_FIFO_SIZE){ auth_fifo_pos=0; } auth_fifo[auth_fifo_pos].account_id=account.account_id; auth_fifo[auth_fifo_pos].login_id1=account.login_id1; auth_fifo[auth_fifo_pos].login_id2=account.login_id2; auth_fifo[auth_fifo_pos].delflag=0; auth_fifo_pos++; } else { WFIFOW(fd,0)=0x6a; WFIFOB(fd,2)=result; WFIFOSET(fd,23); } RFIFOSKIP(fd,55); break; case 0x2710: if(RFIFOREST(fd)<76) return 0; { FILE *logfp=fopen("login.log","a"); if(logfp){ unsigned char *p=(unsigned char *)&session[fd]->client_addr.sin_addr; fprintf(logfp,"server connection request %s @ %d.%d.%d.%d:%d (%d.%d.%d.%d)\n", RFIFOP(fd,60),RFIFOB(fd,54),RFIFOB(fd,55),RFIFOB(fd,56),RFIFOB(fd,57),RFIFOW(fd,58), p[0],p[1],p[2],p[3]); fclose(logfp); } } account.userid = RFIFOP(fd,2); account.passwd = RFIFOP(fd,26); result = mmo_auth(&account); if(result == 100 && account.sex==2 && account.account_id<MAX_SERVERS && server_fd[account.account_id]<0){ memcpy(server[account.account_id].name,RFIFOP(fd,60),16); server[account.account_id].ip=RFIFOL(fd,54); server[account.account_id].port=RFIFOW(fd,58); server[account.account_id].users=0; server_fd[account.account_id]=fd; WFIFOW(fd,0)=0x2711; WFIFOB(fd,2)=0; WFIFOSET(fd,3); session[fd]->func_parse=parse_fromchar; } else { WFIFOW(fd,0)=0x2711; WFIFOB(fd,2)=3; WFIFOSET(fd,3); } RFIFOSKIP(fd,76); return 0; default: close(fd); session[fd]->eof=1; return 0; } } return 0;}int do_init(int argc,char **argv){ int i; for(i=0;i<AUTH_FIFO_SIZE;i++){ auth_fifo[i].delflag=1; } for(i=0;i<MAX_SERVERS;i++){ server_fd[i]=-1; } default_func_parse=parse_login; make_listen_port(6900); mmo_auth_init(); term_func=mmo_auth_sync; return 0;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?