📄 main.c.bak
字号:
*/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; mb[top_store].next = mb[top].next; prev = top; top = mb[top].next; unregMemBuf( prev ); } else { top = mb[top].next; } } } return total;}static int getLineReadBuffer( int index , char *buf, int len ){ int top = con[index].mbtop_ri; int ti = 0 , breakflag = 0; for(;;){ int i; int l = mb[top].len; if( top == -1 )break; for( i=0 ; i < l ; i++){ if( mb[top].buf[i] == '\n' ){ breakflag = 1; break; } ti ++; } if( breakflag )break; top = mb[top].next; } if( ti > len ){ /* 1垫互卅互允亢月[ 卅巨仿□毛井尹六 */ return TCPSTRUCT_ETOOLONG; } /* 垫互敦岳仄化卅中 */ if( breakflag == 0 ){ return 0; } return consumeMemBufList( con[index].mbtop_ri , buf , ti+1 , 1 , 1 );}/* 心仇户月 赢今毛忒允 int index : con index return: 反巨仿□ 0动晓及桦宁反 read 仄化手方中赢今[ mbsize 井日mbuse 毛娄中化扔奶术毛井仃月分仃[ 仇引井中芴曰及坌反 骰允月[公氏卅称井中袄卞仇分歹日卅仁化手第[ */ static int getFreeMem( void ){ return ( mbsize - mbuse ) * sizeof( mb[0].buf );}/* membuf 及坞五毛茧仄分允[ return : 心勾井匀凶日 >=0 匹 index. 心勾井日卅井匀凶日 腹绸及午五卞反 mb_finder 毛勾井丹[ 仇木匹腹绸仄化} 卞reg允月[ */static int findregBlankMemBuf( void ){ int i; for(i=0;i<mbsize;i++){ mb_finder ++; if( mb_finder >= mbsize || mb_finder < 0 ) mb_finder = 0; if( mb[mb_finder].use == 0 ){ mb[mb_finder].use = 1; mb[mb_finder].len = 0; mb[mb_finder].next = -1; mbuse ++; return mb_finder; } } return TCPSTRUCT_EMBFULL;}/* mb 毛荸 允月 */static int unregMemBuf( int index ){ mb[index].use=0; mb[index].next = -1; mb[index].len = 0; mbuse --; return OK;}static int findregBlankCon( void ){ int i; // Nuke changed 0->1 //for(i=0;i<MAXCONNECTION;i++){ for(i=1;i<MAXCONNECTION;i++){ if( con[i].use == 0 ){ con[i].use = 1; con[i].fd = -1; con[i].mbtop_ri = findregBlankMemBuf(); if( con[i].mbtop_ri < 0 ){ fprintf( stderr , "EMBFULL\n" ); return TCPSTRUCT_EMBFULL; } con[i].mbtop_wi = findregBlankMemBuf(); if( con[i].mbtop_wi < 0 ){ unregMemBuf( con[i].mbtop_ri ); fprintf( stderr , "EMBFULL\n" ); return TCPSTRUCT_EMBFULL; } bzero( & con[i].remoteaddr , sizeof( struct sockaddr_in)); con[i].closed_by_remote = 0; return i; } } return TCPSTRUCT_ECFULL;}int tcpstruct_countmbuse( void ){ int i,c=0; for(i=0;i<mbsize;i++){ if( mb[i].use )c++; } return c;}char * getGSName( int i ){ return gs[i].name;}void checkGSUCheck( char *id ){ int i; char gname[256]; if(!id[0]) return; memset( gname, 0, sizeof( gname) ); if( LockNode_getGname( (getHash(id) & 0xff), id, gname) <= 0 ){ log("无法从游戏中找到账号:%x/%s !!\n", getHash( id), id); return; } log("\n"); for(i=0; i < MAXCONNECTION; i++ ){ if( gs[i].name[0] && strcmp( gs[i].name , gname )==0){ log("发送解锁检查[%s] 到 %d.%x/%s 服务器:%d !!\n", id, i, getHash( id), gname, gs[i].fd); saacproto_ACUCheck_send( gs[i].fd , id ); return; } }// log("Can't find gname:%s sending err !!\n", gname); int ret = -1; if( !isLocked( id) ) { log( "删除内存信息: 用户:%x/%s 没有锁定!!\n", getHash(id), id); } if( DeleteMemLock( getHash(id) & 0xff, id, &ret) ) { } else { log( "不能解锁 %x:%s !\n", getHash(id), id); }}void set_nodelay( int sock ){ int flag = 1; int result = setsockopt( sock, IPPROTO_TCP, TCP_NODELAY, (char*)&flag, sizeof(int)); if( result < 0 ){ log( "不能设置延迟.\n" ); } else { log( "设置延迟: fd:%d\n", sock ); }}/* 允屯化及必□丞扔□田□卞 霜[ int flag : 1分匀凶日霜耨葭卞反云仁日卅中 */void gmsvBroadcast( int fd, char *p1, char *p2, char *p3 , int flag ){ int i,c=0; for(i=0;i<MAXCONNECTION;i++){ if( ( flag == 1 ) && ( i == fd ) )continue; if( gs[i].use && gs[i].name[0] ){ saacproto_Broadcast_send( i, p1,p2,p3); c++; } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -