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

📄 main.c

📁 石器时代8.0服务端完整源代码。可以直接编译
💻 C
📖 第 1 页 / 共 4 页
字号:
#define _MAIN_C_#ifdef _SASQL1#include "sasql.h"#endif#include "main.h"#include "util.h"#include "mail.h"#include "db.h"#include "saacproto_util.h"#include "saacproto_serv.h"#ifdef _UNIVERSE_CHATROOM#include "chatroom.h"#endif// CoolFish: Family 2001/5/9#include "acfamily.h"#include "version.h"#ifdef _DEATH_CONTEND#include "deathcontend.h"#endif#include <signal.h>#include <sys/types.h>#include <time.h>#include <sys/time.h>#include <errno.h>#include <sys/wait.h>#include <getopt.h>#include <stdio.h>#include <malloc.h>#include <strings.h>#include <string.h>#include <unistd.h>#include <netdb.h>#include <errno.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <time.h>#include <fcntl.h>#include <netinet/tcp.h>#include "saacproto_work.h"#ifdef _OACSTRUCT_TCP#include "saacproto_oac.h"#endif#ifdef _PAUCTION_MAN#include "auction.h"#endif#include "lock.h"#define BACKLOGNUM 5#ifdef _FIX_WORKS#include "saacproto_work.h"int worksockfd;#endif#ifdef _LOCK_SERVER#include "saacproto_lserver.h"#endif#ifdef _SEND_EFFECT				  // WON ADD 送下雪、下雨等特效 #include "recv.h"#endif#include "defend.h"#include "char.h"#ifdef _SASQL#include "sasql.h"#endif#ifndef _FIX_WORKSstruct membuf{    int use;    char buf[512];//    char buf[1024*128];    int len;    int next;};struct connection{    int use;        int fd;           int mbtop_ri;    int mbtop_wi;    struct sockaddr_in remoteaddr;    int closed_by_remote;};#else#endifstruct membuf *mb;int mbsize;int mbuse ;int mainsockfd;             /* accept 及  域娄醒卞中木月 */struct sockaddr_in localaddr;       /* bind 允月失玉伊旦 */    struct connection *con;        /* 戊生弁扑亦件     */static int mb_finder=0;              /* mb及坞五毛腹绸允月凶户及                               腹绸玄永皿及匏  筏盛迕 */// WON FIXchar tmpbuf[65536];//char tmpbuf[65536*3];         /* read迕 */struct timeval select_timeout;time_t sys_time =0; // Robin addextern gmsv gs[MAXCONNECTION];int tcpstruct_init( char *addr, int port, int timeout_ms, int mem_use, int deb);int tcpstruct_accept1( void );int tcpstruct_accept( int *tis , int ticount );int tcpstruct_close( int ti );int tcpstruct_read( int ti , char *buf , int len );int tcpstruct_readline( int ti , char *buf , int len ,int k ,int r);int tcpstruct_readline_chop( int ti , char *buf, int len );int tcpstruct_write( int ti , char *buf , int len );int tcpstruct_countmbuse( void );int tcpstruct_connect( char *addr , int port );#ifndef _FIX_WORKSvoid set_nodelay( int sock );#define OK     0        /* 岳   */#define TCPSTRUCT_ENOMEM -1       /* malloc 撩   */#define TCPSTRUCT_ESOCK -2        /* socket 撩   */#define TCPSTRUCT_EBIND -3        /* bind 撩   */#define TCPSTRUCT_ELISTEN -4      /* listen 撩   */#define TCPSTRUCT_EBUG -6         /* 田弘匹丐月 */#define TCPSTRUCT_EINVCIND -7     /* con尺及index互云井仄中方 */#define TCPSTRUCT_EREADFIN -8     /* read 允月犯□正互卅仁化 closed by remote */#define TCPSTRUCT_EHOST -9        /* gethostbyname 撩   */#define TCPSTRUCT_ECONNECT -10    /* connect 撩   */#define TCPSTRUCT_ECFULL -11      /* con 互中匀天中 */#define TCPSTRUCT_ETOOLONG -12    /* 垫互卅互允亢 */#define TCPSTRUCT_EMBFULL -13     /* mb 互中匀天中  */#define TCPSTRUCT_ECLOSEAGAIN -14 /* close 互2荚今木凶 */#endifint port;               /* 必□丞扔□田□互涛粮仄化仁月禾□玄 */int Total_Charlist;int Expired_mail;int Del_Family_or_Member;int Write_Family;#ifdef _NEW_PLAYERGOLDint New_PlayerGold;#endif// Nuke startchar *chartime(){    static char buf[80];    time_t t;    t=time(0);    strcpy(buf,ctime(&t));    buf[strlen(buf)-1]=0;    return(buf);}/*  sigaction白弁 */void sighandle( int a ){    if (a==SIGUSR1) log("sigusr1信号!\n");	if (a==SIGUSR2) {		sigusr2( a);		log("sigusr2信号!\n");		return;	}	#ifdef _SQL_BACKGROUND      if(!sasql_initonline())      	log("\n数据库保存失败!\n");  #endif    log("得到一个信号! 异常中断......\n" );    exit(1);}void sigusr2(int a);// Arminius 7.20 memory unlockvoid sigusr1(int a){  int i;  FILE *f;  char key[4096],buf[4096];  signal(SIGUSR1, sigusr1);    f = fopen("./unlock.arg", "r");  if (f) {    memset(key, 0, 4096);    fread(key, 4096, 1, f);    for (i=0; i<strlen(key); i++) if (key[i]=='\n') key[i]='\0';    switch (key[0]) {    case 'P':	// unlock player      if (DeleteMemLock(getHash(&key[1]) & 0xff,&key[1],&i)) {        log("ADM: memunlock: %s success.\n", key);      } else {        log("ADM: memunlock: %s failed.\n", key);      }    break;    case 'S':	// unlock server      DeleteMemLockServer(&key[1]);      log("ADM: memunlock: %s\n", key);    break;    case 'C':	// check player lock      GetMemLockState(getHash(&key[1]) & 0xff, &key[1], buf);      sprintf(key, "echo \"%s\" > ./sigusr1.result", buf);      system(key);    break;#ifdef _CK_ONLINE_PLAYER_COUNT    // WON ADD 计算线上人数	case 'W':	      PlayerCount();	break;#endif#ifdef _SEND_EFFECT		   // WON ADD 送下雪、下雨等特效	case 'E':			log("\nAC 向 GS 发送下雪特效!!\n");	    SendEffect(&key[1]);	break;#endif#ifdef _BAD_PLAYER            // WON ADD 送坏玩家去关	case 'B':		log("\nAC 发送坏玩家监狱!!\n");		BadPlayer();	break;#endif#ifdef _RECAL_BACKUP_PLAYER			// WON 回溯功能	case 'U':		log("\n发送备份人物资料");		// 得到备份人物资料		send_backup_player_data();	break;#endif	#ifdef _GM_BROADCAST					// WON ADD 客服公告系统	case 'G':		log("\n won test 1 ==> _GM_BROADCAST" );		broadcast(key);	break;#endif#ifdef _KILLDEADWORKER	// 将所有Worker初始化	case 'K':		log("\nKILL ALL WORKER!!!!!\n");		initWorkerPort();	break;#endif	case 'L':  // Robin 列出所有Server连线		log("\nList All Server Conncet!!!!!\n");		for( i =0; i <MAXCONNECTION; i++)			if( gs[i].use)				log("\n gs[%d] fd:%d name:%s ", i, gs[i].fd, gs[i].name );	break;    }	log(" sigusr1_over_1 ");	fclose(f);	log(" sigusr1_over_2 ");  }}static int netWrite( int ti , char *buf , int len){    return tcpstruct_write( ti , buf, len );}#ifndef _FIX_WORKStypedef enum{    WKSTAT_IDLE = 0,            /* 窒手仄化卅中橇谪 */    WKSTAT_WAITING = 2          /* 伐□市井日及忒蚕毛引匀化月橇谪 */} WKSTAT;struct worker{    int use;    int port;    int ti;    int request_ti;    WKSTAT status;    time_t last_query;    void (*callback)( int ti , int result , char *cparam0 , char *cparam1,                      char *cparam2 , char *cparam3, char *cparam4,                       int iparam1 , int iparam2 );#define CPARAMNUM 5    char cparam[CPARAMNUM][CHARDATASIZE];#define IPARAMNUM 3        int iparam[IPARAMNUM];};struct worker wk[MAXWK];#endif#ifndef _FIX_WORKSstatic void addWorkerPort( int port ){    int i;    for(i=0;i<MAXWK;i++){        if( wk[i].use == 0 ){            wk[i].use = 1;            wk[i].port = port;            wk[i].ti = -1;            return;        }    }    exit(1);}#endifint worker_finder = 0;static void initWorkerPort( void ){    int i;    bzero( &wk , sizeof( wk ));    for(i=0;i<MAXWK;i++){#ifdef _FIX_WORKS		wk[i].use = 0;		wk[i].status = WKSTAT_IDLE;		if( wk[i].fd < 0 )			close( wk[i].fd);		wk[i].fd = -1;		wk[i].last_query = -1;#else        wk[i].status = WKSTAT_IDLE;#endif    }	worker_finder = 0;}static void connectToWorker( void ){#ifndef _FIX_WORKS    int i;    for(i=0;i<MAXWK;i++){        if( wk[i].use ){            int ti = tcpstruct_connect( "127.0.0.1" , wk[i].port );            if( ti >= 0 ){                wk[i].ti = ti;            } else {                exit(1);            }        }    }#endif}static int countWorker( void );// Nukeint addWorkerTask( char *id , char *pas , char *flag,                   void (*callbk)( int ti , int result ,                                   char *cp0 , char *cp1 , char *cp2 ,                                   char *cp3 , char *cp4, int i0 , int i1) ,                   int ti ,                    char *cparam0 , char *cparam1 ,                   char *cparam2 , char *cparam3 , char *cparam4 ,                    int iparam0 , int iparam1){    int i;    // Spock +1 2000/11/2    char *process = cparam3;    for(i=0;i<MAXWK;i++){        int n;        worker_finder ++;        if( worker_finder >= MAXWK ) worker_finder = 0;        n = worker_finder;        if( wk[n].use && wk[n].status == WKSTAT_IDLE ){            char s[256];			log("使用工作站:%d \n", n);            // Nuke            {            	int i;            	for (i=0;id[i];i++) if (id[i]==' ') return -1;            }	    // Spock 2000/11/2            snprintf( s , sizeof( s ) , "%s %s %s %s\n", id , pas , flag , process);	    // Spock end#ifdef _FIX_WORKS			if( cWork_write( wk[n].ti, s, strlen(s)) <= 0 )	{#else            if( tcpstruct_write( wk[n].ti , s , strlen(s)) != strlen(s) ){#endif                return -1;            } else {            }            snprintf( wk[n].cparam[0] , CHARDATASIZE , "%s", cparam0 );            snprintf( wk[n].cparam[1] , CHARDATASIZE , "%s", cparam1 );            snprintf( wk[n].cparam[2] , CHARDATASIZE , "%s", cparam2 );            snprintf( wk[n].cparam[3] , CHARDATASIZE , "%s", cparam3 );            snprintf( wk[n].cparam[4] , CHARDATASIZE , "%s", cparam4 );            wk[n].iparam[0] = iparam0;            wk[n].iparam[1] = iparam1;            wk[n].status = WKSTAT_WAITING;            wk[n].callback = callbk;            wk[n].request_ti = ti ;            wk[n].last_query = time(NULL);						return 0;        }    }    log( "工作站繁忙或工作站停止工作. 活动中的工作站有:%d\n", countWorker() );    return -1;}static int countWorker( void ){    int i,c=0;    for(i=0;i<MAXWK;i++){        if( wk[i].use )c++;    }    return c;}#ifndef _FIX_WORKSstatic void checkWorkerClosed( int ti ){    int i;    for(i=0;i<MAXWK;i++){        if( wk[i].ti == ti ){            wk[i].use = 0;            wk[i].ti = -1;        }    }}#endifstatic void doWorker( int ti , char *m ){    int i;    int res=-1;    char deadline[128];#ifdef _TIMEOUTKICK	//log("工作站:%s ", m);	// Nuke 20040519: Protect from error from worker	if (m) 	{		char *p1,*p2;		p1=strtok(m," ");		p2=strtok(0," ");				if (p1)			res = atoi( p1 );		else			res=-1;				if (p2)			strcpy( deadline, p2 ); // 取得 deadline		else {			strcpy( deadline, "0" );			//log("\n 工作站回传消息:%d:%s ", ti, p1);		}	}	else	{		res=-1;		strcpy( deadline, "0" );	}#else	res = atoi( m );#endif#ifdef _NO_DOUBLECHECK	res =0;#endif    for( i=0; i<MAXWK; i++){        if( wk[i].use && wk[i].ti == ti ){            if( wk[i].status == WKSTAT_WAITING ){					if( wk[i].callback ){#ifdef _TIMEOUTKICK						strcpy( wk[i].cparam[4] ,deadline);#endif						// Robin log						//log(" wk[%d] c0:%s c1:%s c2:%s c3:%s c4:%s i0:%d i1:%d ",						//		wk[i].request_ti, wk[i].cparam[0], wk[i].cparam[1],						//		wk[i].cparam[2], wk[i].cparam[3], wk[i].cparam[4],						//		wk[i].iparam[0], wk[i].iparam[1]);						wk[i].callback( wk[i].request_ti , res,										wk[i].cparam[0] ,										wk[i].cparam[1] ,										wk[i].cparam[2] ,										wk[i].cparam[3] ,										wk[i].cparam[4] ,										wk[i].iparam[0] ,										wk[i].iparam[1] );					} else {						log( "工作站: 漏洞! callback 不能初始化\n");					}				wk[i].status = WKSTAT_IDLE;            }        }    }}static int isWorker( int ti ){#ifndef _FIX_WORKS    int i;    for(i=0;i<MAXWK;i++){        if( wk[i].use && wk[i].ti == ti )return 1;    }#endif    return 0;}gmsv gs[MAXCONNECTION];int login_game_server( int ti , char *svname , char *svpas ,               char *result , int resultlen ,               char *retdata , int retdatalen ){    if( strcmp( svpas , svpass ) == 0 ){

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -