📄 main.c
字号:
log("\n用户(%s) 登出! 玩家解锁!!\n", gs[i].name );#endif logout_game_server( i ); } else if( l < 0 ){ log( "关闭:%d 服务器名:%s\n", i , gs[i].name );#ifdef _UNIVERSE_CHATROOM CHATROOM_GSClosedHandle( i);#endif#ifdef _AC_UNLOCK_GS_PLAYER // WON ADD 自动UNLOCK DeleteMemLockServer(gs[i].name); log("\n用户(%s) 登出! 玩家解锁!!\n", gs[i].name );#endif#ifdef _WORKER_AUTO_LOGOUT // WON ADD GS断线自动送LOGOUT给WORKER Worker_auto_logout( i, gs[i].name );#endif 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; } /* 伐□市□及正奶丞失它玄毛譬屯月[ 正奶丞失它玄仄凶日夫弘毛分仄化伐□市□毛诮仄化仄引丹[ 匹必□丞扔□田□卞 蔽读卞反骚襞允月 */ { int i; time_t thre = time(NULL) - WKTIMEOUT; for(i =0;i<MAXWK;i++){ if( !wk[i].use )continue; if( wk[i].last_query && wk[i].status == WKSTAT_WAITING && wk[i].last_query < thre ){ // Nuke start-- log( "工作站 %d 超时! 关闭中...\n", i );#ifdef _FIX_WORKS Work_close( wk[i].ti ); wk[i].use = 0; wk[i].fd = -1; wk[i].status = WKSTAT_IDLE;#else tcpstruct_close( wk[i].ti );#endif log( "工作站 %d 超时! uhmmm...\n", i); if( wk[i].callback ){ // 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 , -1, 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].use = 0; } } } } } #ifdef _SASQL sasql_close();#endif return 0; }doubletime_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;#ifdef _FIX_WORKS //for work MEMBuffer_Init(); if( SetWorkConnectionInit( 1) <= 0 ) return TCPSTRUCT_WORKERROR; worksockfd = socket( AF_INET , SOCK_STREAM , 0 ); log( "开始工作: %d...\n" , worksockfd); if( worksockfd < 0 ) return TCPSTRUCT_ESOCK; bzero( &localaddr ,sizeof( localaddr )); localaddr.sin_family = AF_INET; localaddr.sin_port = htons( FORWORKPORT ); localaddr.sin_addr.s_addr = /*htonl( INADDR_ANY );*/inet_addr( "127.0.0.1" ); if( bind( worksockfd , (struct sockaddr*) &localaddr , sizeof( localaddr )) < 0 ) return TCPSTRUCT_WORKEBIND; if( listen( worksockfd , BACKLOGNUM )<0) return TCPSTRUCT_ELISTEN;#endif 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; 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( 1024, & rfds , (fd_set*)NULL, & efds , &t); if( sret > 0 ) { for(i=0;i< MAXCONNECTION;i++){ 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 ); } } } } /* write */ t = select_timeout; sret = select( 1024, (fd_set*)NULL, &wfds, & efds , &t); if( sret > 0 ) { for(i=0;i<MAXCONNECTION;i++){ if( ( con[i].fd >= 0 ) && FD_ISSET( con[i].fd , &wfds )){ char send_buf[4096]; int l , rr; memset( send_buf, 0, sizeof( send_buf)); l = consumeMemBufList( con[i].mbtop_wi ,send_buf, sizeof(send_buf),0 , 1 ); rr = write( con[i].fd , send_buf , l ); if( rr < 0 ){ con[i].closed_by_remote = 1; } else { 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( 1024, &rfds , &wfds , &efds, &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;}/* 心仇戈手及互手丹卅仁化}仄井手 remoteclose 分匀凶日 -1 毛井尹允 */int tcpstruct_read( int ti , char *buf , int len ){ int l; if( ti < 0 || ti >= MAXCONNECTION || con[ti].use == 0 ) return TCPSTRUCT_EINVCIND; l = consumeMemBufList( con[ti].mbtop_ri , buf , len , 1 , 1); if( l == 0 && con[ti].closed_by_remote ) return TCPSTRUCT_EREADFIN; return l;}/* 1垫毛方心仇戈[ int kend : 1卅日垫 及 \n 毛诮允 int kend_r : 1卅日垫 及 \r 手诮允(丐木壬) 心仇戈手及互手丹卅仁化}井勾 remote closed 分匀凶日-1毛井尹允 // Nuke Read 1 line if kend==1 then delete \n at the tail if kend_r== 1 then delete \r at the tail (if any) if no data read, it means 'remote closed' then return -1 */int tcpstruct_readline( int ti , char *buf , int len , int kend , int kend_r ){ int l; int minus = 0; if( ti < 0 || ti >= MAXCONNECTION || con[ti].use == 0 ) return TCPSTRUCT_EINVCIND; l = getLineReadBuffer( ti , buf , len ); if( l == 0 ){ if( con[ti].closed_by_remote ){ return TCPSTRUCT_EREADFIN; } else { return 0; } } if( kend ){ if( buf[l-1]=='\n' ){ buf[l-1] = 0; minus =-1; } } if( kend_r ){ if( buf[l-1]=='\r' ){ buf[l-1] = 0; minus = -1; } if( buf[l-2]=='\r' ){ buf[l-2] = 0; minus = -2; } } return l + minus;}int tcpstruct_readline_chop( int ti , char *buf, int len ){ return tcpstruct_readline( ti , buf , len , 1,1);}int tcpstruct_write( int ti , char *buf , int len ){ if( ti < 0 || ti >= MAXCONNECTION || con[ti].use == 0 ) return TCPSTRUCT_EINVCIND; return appendWriteBuffer( ti , buf , len );}int tcpstruct_connect( char *addr , int port ){ int newti ; int s, r; struct sockaddr_in svaddr; struct hostent *he; s = socket( AF_INET, SOCK_STREAM , 0 ); if(s<0)return -2; bzero( &svaddr , sizeof( svaddr )); svaddr.sin_family = AF_INET; svaddr.sin_port = htons( port ); if( inet_aton( addr, &svaddr.sin_addr ) == 0 ){ he = gethostbyname( addr ); if( he == NULL ){ return TCPSTRUCT_EHOST; } memcpy( & svaddr.sin_addr.s_addr , he->h_addr , sizeof( struct in_addr)); } r = connect( s , ( struct sockaddr*)&svaddr,sizeof(svaddr)); if( r < 0 ){ return TCPSTRUCT_ECONNECT; } set_nodelay( s ); newti = findregBlankCon( ); if( newti < 0 ){ fprintf( stderr , "连接失败: newti:%d\n", newti ); return TCPSTRUCT_ECFULL; } con[newti].fd = s; memcpy( & con[newti].remoteaddr , &svaddr , sizeof( struct sockaddr_in)); return newti;}static int appendReadBuffer( int index , char *data , int len ){ int top; top = con[index].mbtop_ri; for(;;){ int nextind = mb[top].next; if( nextind == -1 ) break; top = nextind; } return appendMemBufList( top , data , len );}static int appendWriteBuffer( int index , char *data , int len ){ int top; top = con[index].mbtop_wi; for(;;){ int nextind = mb[top].next; if( nextind == -1 ) break; top = nextind; } return appendMemBufList( top , data , len );}static int appendMemBufList( int top , char *data , int len ){ int fr = getFreeMem( ); int rest = len; int data_topaddr = 0; if( len >= fr ){ FILE *fp; if( (fp=fopen( "badsysinfo.txt", "a+")) != NULL ){ fprintf( fp, "appendMemBufList() len:%d / fr:%d err !! \n", len, fr); fclose( fp); } //andy_log log( "appendMemBufList() len:%d / fr:%d err !! \n", len, fr); return -1; } data[len] = 0; for(;;){ int blanksize = sizeof( mb[0].buf ) - mb[top].len; int cpsize = ( rest <= blanksize ) ? rest : blanksize; memcpy( mb[top].buf + mb[top].len , data + data_topaddr , cpsize ); mb[top].len += cpsize; if( rest <= blanksize ){ return len; } else { int newmb; rest -= cpsize; data_topaddr += cpsize; if( (newmb = findregBlankMemBuf( ) ) == TCPSTRUCT_EMBFULL ){ FILE *fp; if( (fp=fopen( "badsysinfo.txt", "a+")) != NULL ){ fprintf( fp, "find newmb == TCPSTRUCT_EMBFULL err data:%s !!\n", data); fclose( fp); } log( "find newmb == TCPSTRUCT_EMBFULL err data:%s !!\n", data); } mb[top].next = newmb; top = mb[top].next; } } return TCPSTRUCT_EBUG;}static int consumeMemBufList( int top , char *out , int len , int consumeflag , int copyflag ){ int total = 0; int top_store = top; for(;;){ int cpsize; if( top == -1 ) break; cpsize = ( mb[top].len <= ( len - total) ) ? mb[top].len : ( len - total ); if( copyflag ) memcpy( out + total , mb[top].buf , cpsize ); total += cpsize; if( consumeflag ){ mb[top].len -= cpsize; if( mb[top].len > 0 ){ /* 勾井中反凶仄化卅中及匹memmove */ memmove( mb[top].buf , mb[top].buf + cpsize , sizeof( mb[top].buf ) - cpsize ); } } top = mb[top].next; if( total == len ){ break; } } if( consumeflag ){ /* 卅互今互0卞卅匀化月卅日荸 [匹手 赓及支勾反荸 仄卅中冗 */ top = mb[top_store].next; for(;;){ if( top == -1 )break; if( mb[top].len == 0 ){ int prev;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -