📄 main.c
字号:
}
/*
心仇戈手及互手丹卅仁化}仄井手 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;
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 + -