📄 main.c
字号:
Lock_Init(); // Arminius 7.17 memory lock
UNlockM_Init();
if(readConfig( "acserv.cf" )<0){
log( "无法在当前目录里读取 acserv.cf .\n" );
exit(1);
}
#ifdef _SASQL
sasql_init();
#endif
log( "读取数据目录\n" );
dbRead( dbdir );
#ifdef _FAMILY
log("读取 家族庄园\n");
readFMSMemo(fmsmemodir);
log("读取 家族留言\n");
readFMPoint(fmpointdir);
log("读取 家族目录\n");
readFamily(familydir);
#endif
log( "准备 档案目录\n" );
prepareDirectories( chardir );
log( "准备 日志目录\n" );
prepareDirectories( logdir );
log( "准备 邮件目录\n" );
prepareDirectories( maildir );
#ifdef _SLEEP_CHAR
prepareDirectories( sleepchardir );
log( "准备 睡眠档案目录\n" );
#endif
/* 凶引匀化月丢□伙毛 心仇戈 */
if( readMail(maildir) < 0 ){
log( "不能初始化邮件\n" );
exit(1);
}
/* TCPSTRUCT 毛赓渝祭 */
{
int tcpr;
if( ( tcpr = tcpstruct_init( NULL , port , 0 ,
CHARDATASIZE * 16 * MAXCONNECTION , 1 /* DEBUG */ ) ) < 0 ){
log( "不能开启TCP: %d\n", tcpr );
return 1;
}
}
saacproto_InitServer( netWrite , CHARDATASIZE );
{
struct sigaction s,os;
bzero( &s, sizeof(s));
s.sa_handler = sighandle;
s.sa_flags = SA_NOMASK;
sigaction( SIGTERM, &s, &os );
bzero( &s, sizeof(s));
s.sa_handler = sighandle;
s.sa_flags = SA_NOMASK;
sigaction( SIGINT, &s, &os );
bzero( &s, sizeof( s ));
s.sa_handler = SIG_IGN;
s.sa_flags = SA_NOMASK;
sigaction( SIGPIPE, &s, &os );
}
#ifdef _AC_SEND_FM_PK // WON ADD 庄园对战列表储存在AC
load_fm_pk_list();
#endif
#ifdef _ACFMPK_LIST
FMPK_LoadList();
#endif
#ifdef _ALLDOMAN
LOAD_herolist(); // Syu ADD 排行榜NPC
#endif
#ifdef _VIP
log( "\n服务端版本: <%s 会员版>\n" , SERVER_VERSION );
#else
log( "\n服务端版本: <%s 普通版>\n" , SERVER_VERSION );
#endif
log( "\n服务端编译完成时间:%s %s by 龙zoro工作室\n" , __DATE__ , __TIME__ );
log( "\n开始工作...\n" );
signal(SIGUSR1,sigusr1); // Arminius 7.20 memory lock
int itime=0;
while(1){
itime++;
if(itime>cpuuse){
itime=0;
usleep(1);
}
int newti,i;
static time_t main_loop_time;
sys_time = time(NULL);
if( main_loop_time != sys_time){
main_loop_time = time(NULL);
counter1++;
counter2++;
counter3++;
counter4++;
//andy add 2002/06/20
UNlockM_UnlockPlayer();
// Nuke *1 1012
if( counter1 > Total_Charlist ){
counter1=0;
char *c = ctime( &main_loop_time );
if( c ){
struct timeval st,et;
log( "\nTIME:%s\n",c );
gettimeofday( &st,NULL);
dbFlush(dbdir);
gettimeofday( &et,NULL);
log( "Flushed db(%fsec)\n", time_diff(et,st) );
log( "档案表列总数:%d NG:%d\n",
total_ok_charlist, total_ng_charlist );
}
}
// Nuke **1 1012
//if( ( counter % 600 ) == 0 ){
if( counter2 > Expired_mail ){
counter2=0;
struct timeval st,et;
gettimeofday( &st,NULL);
expireMail();
gettimeofday( &et,NULL);
log( "过期邮件(%fsec)\n", time_diff(et,st) );
}
#ifdef _FAMILY
//if ((counter % 300) == 0) // 300( -> 60)
if( counter4 > Write_Family ) // 300( -> 60)
{
counter4=0;
struct timeval st, et;
gettimeofday(&st, NULL);
writeFamily(familydir);
writeFMPoint(fmpointdir);
writeFMSMemo(fmsmemodir);
gettimeofday(&et, NULL);
log("记录家族(%fsec)\n", time_diff(et, st));
}
#endif
}
newti = tcpstruct_accept1();
if( newti >= 0 ){
log( "同意: %d\n" , newti );
gs[newti].use = 1;
}
for(i=0;i<MAXCONNECTION;i++){
// char buf[CHARDATASIZE * 16;
char buf[CHARDATASIZE];
int l;
l = tcpstruct_readline_chop( i , buf , sizeof( buf )- 1);
{
if( !gs[i].use )continue;
if( l > 0 ){
char debugfun[256];
buf[l]=0;
if( saacproto_ServerDispatchMessage( i , buf, debugfun)<0){
// Nuke start
tcpstruct_close(i);// avoid the shutdown the gmsv ttom
log( "GMSV(%s) 消息:%s\n", gs[i].name, debugfun);
}
} else if( l == TCPSTRUCT_ETOOLONG ){
log( "很长:%d 服务器名::%s\n", i , gs[i].name );
logout_game_server( i );
} else if( l < 0 ){
log( "关闭:%d 服务器名:%s\n", i , gs[i].name );
logout_game_server(i);
} else if( l == 0 ){
;
}
}
}
{
static struct timeval tv_loop_store ;
struct timeval now;
double dif;
gettimeofday( &now , NULL );
dif = time_diff( now, tv_loop_store );
if( dif > 0.5 ){ // CoolFish 0.1 -> 0.5 2001/5/19
//log( "Sl:%f" , dif );
}
tv_loop_store = now;
}
/* 伐□市□及正奶丞失它玄毛譬屯月[
正奶丞失它玄仄凶日夫弘毛分仄化伐□市□毛诮仄化仄引丹[
匹必□丞扔□田□卞 蔽读卞反骚襞允月 */
}
return 0;
}
double
time_diff(struct timeval subtrahend,
struct timeval subtractor)
{
return( (subtrahend.tv_sec - subtractor.tv_sec)
+ (subtrahend.tv_usec
- subtractor.tv_usec ) / (double)1E6 );
}
/*
夫弘及夫□ □玄市它件玄毛 月[
云卅元凛渝及手及反允屯化及夫弘白央奶伙互云卅元卞卅月方丹卞允月[
仇及酷 反醒侬及瑕互云云仁卅月互} 匹奶件正□田伙毛 凳仄化手
暹屺分[
*/
int get_rotate_count(void )
{
int a;
unsigned int t = (unsigned int ) time(NULL);
a = ( t / log_rotate_interval ) * log_rotate_interval;
return a;
}
static int findregBlankMemBuf( void );
static int unregMemBuf( int index );
static int findregBlankCon( void );
static int getFreeMem( void );
static int appendReadBuffer( int index, char *data, int len );
static int appendWriteBuffer( int index , char *data, int len );
static int appendMemBufList( int top, char *data, int len );
static int consumeMemBufList( int top, char *out, int len, int flag, int copyflag );
static int getLineReadBuffer( int index, char *buf, int len );
int tcpstruct_init( char *addr , int p , int timeout_ms , int mem_use , int db )
{
mbsize = mem_use / sizeof( struct membuf );
mbuse =0;
mb_finder = 0;
mb = ( struct membuf * ) calloc( 1, mbsize * sizeof(struct membuf ));
if( mb == NULL ) return TCPSTRUCT_ENOMEM;
bzero( mb , mbsize * sizeof( struct membuf ));
con = ( struct connection *) calloc( 1, MAXCONNECTION * sizeof( struct connection ));
if( con == NULL ){
free( mb );
return TCPSTRUCT_ENOMEM;
} else {
int i;
for(i=0;i<MAXCONNECTION;i++){
con[i].use = 0;
con[i].fd = -1;
}
}
select_timeout.tv_sec = timeout_ms / 1000;
select_timeout.tv_usec = (timeout_ms - ( timeout_ms/1000)*1000)*1000;
/* socket */
mainsockfd = socket( AF_INET , SOCK_STREAM , 0 );
if( mainsockfd < 0 ) return TCPSTRUCT_ESOCK;
/* bind */
bzero( &localaddr ,sizeof( localaddr ));
localaddr.sin_family = AF_INET;
localaddr.sin_port = htons( p );
if( addr ){
localaddr.sin_addr.s_addr = inet_addr( addr );
} else {
localaddr.sin_addr.s_addr = htonl( INADDR_ANY );
}
if( bind( mainsockfd , (struct sockaddr*) &localaddr ,
sizeof( localaddr )) < 0 ) return TCPSTRUCT_EBIND;
/* listen */
if( listen( mainsockfd , BACKLOGNUM )<0) return TCPSTRUCT_ELISTEN;
return OK;
}
int tcpstruct_accept1( void )
{
int tis[BACKLOGNUM];
int ret;
ret = tcpstruct_accept( tis , 1 );
if( ret < 0 ){
return ret;
} else if( ret == 1 ){
return tis[0];
} else {
return TCPSTRUCT_EBUG ;
}
}
int tcpstruct_accept( int *tis , int ticount )
{
int i;
int sret = 0;
int accepted = 0;
struct timeval t;
fd_set rfds, wfds , efds;
FD_ZERO( & rfds );
FD_ZERO( & wfds );
FD_ZERO( & efds );
for(i=0;i<MAXCONNECTION;i++){
if( con[i].use &&
con[i].fd >= 0 && con[i].closed_by_remote ==0 ){
FD_SET( con[i].fd , & rfds );
FD_SET( con[i].fd , & wfds );
FD_SET( con[i].fd , & efds );
t = select_timeout;
sret = select( con[i].fd+1, & rfds , (fd_set*)NULL, (fd_set*)NULL , &t);
if( sret > 0 ) {
if( ( con[i].fd >= 0 ) && FD_ISSET( con[i].fd , &rfds ) ){
int fr = getFreeMem( );
int rr , readsize ;
if( fr <= 0 ) continue;
if( fr > sizeof(tmpbuf ) ){
readsize = sizeof( tmpbuf);
} else {
readsize = fr;
}
rr = read( con[i].fd , tmpbuf , readsize );
if( rr <= 0 ){
con[i].closed_by_remote = 1;
} else {
appendReadBuffer( i , tmpbuf , rr );
#ifdef _DEBUG
printf("读取内容:%s\n",tmpbuf);
#endif
}
}
}
t = select_timeout;
sret = select( con[i].fd+1, (fd_set*)NULL, &wfds, (fd_set*)NULL , &t);
if( sret > 0 ) {
if( ( con[i].fd >= 0 ) && FD_ISSET( con[i].fd , &wfds )){
char send_buf[4096];
memset( send_buf, 0, sizeof( send_buf));
int l = consumeMemBufList( con[i].mbtop_wi ,send_buf, sizeof(send_buf),0 , 1 );
if(l>0){
int rr = write( con[i].fd , send_buf , l );
if( rr < 0 ){
con[i].closed_by_remote = 1;
} else {
#ifdef _DEBUG
printf("发送内容:%s\n",send_buf);
#endif
consumeMemBufList( con[i].mbtop_wi , send_buf, l, 1 , 0 );
}
}
}
}
}
}
for( i=0; i<ticount; i++){
int asret;
struct timeval t;
t.tv_sec =0;
t.tv_usec =0;
FD_ZERO( & rfds );
FD_ZERO( & wfds );
FD_ZERO( & efds );
FD_SET( mainsockfd , & rfds );
FD_SET( mainsockfd , & wfds );
FD_SET( mainsockfd , & efds );
asret = select( mainsockfd+1, &rfds , &wfds , (fd_set*)NULL, &t );
// Nuke 20040610: add asret>0 to avoid signal interrupt in select
if( (asret>0) && FD_ISSET( mainsockfd , & rfds )){
struct sockaddr_in c;
int len , newsockfd;
int newcon;
bzero( &c , sizeof( c ));
len = sizeof( c );
fprintf( stderr, "i can accept " );
newcon = findregBlankCon( );
if( newcon < 0 ) continue;
newsockfd = accept( mainsockfd, (struct sockaddr*)&c , &len );
log( "同意: %d\n" , newsockfd );
if( newsockfd < 0 ){
unregMemBuf( newcon );
continue;
}
set_nodelay( newsockfd );
con[newcon].fd = newsockfd;
memcpy( &con[newcon].remoteaddr , &c ,sizeof(c));
tis[accepted] = newcon;
accepted ++;
}
}
return accepted;
}
int tcpstruct_close( int ti )
{
if( ti < 0 || ti >= MAXCONNECTION )return TCPSTRUCT_EINVCIND;
if( con[ti].use == 0 ){
return TCPSTRUCT_ECLOSEAGAIN;
}
close( con[ti].fd );
con[ti].use = 0;
con[ti].fd = -1;
/* 伉旦玄毛凶升匀化蝈 毛弁伉失允月 */
consumeMemBufList( con[ti].mbtop_ri , NULL,
mbsize * sizeof( mb[0].buf ), 1, 0 );
consumeMemBufList( con[ti].mbtop_wi , NULL,
mbsize * sizeof( mb[0].buf ), 1, 0 );
unregMemBuf( con[ti].mbtop_ri );
unregMemBuf( con[ti].mbtop_wi );
con[ti].mbtop_ri = -1;
con[ti].mbtop_wi = -1;
return OK;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -