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

📄 saacproto_work.c

📁 石器时代8.0服务端完整源代码。可以直接编译
💻 C
字号:
#include "version.h"#include "main.h"#include "recv.h"#ifdef _FIX_WORKS#include "saacproto_serv.h"#include "saacproto_work.h"#include "char.h"extern int worksockfd;struct timeval select_timeout;static int findWk = 0;int FindWorkRegBlankCon( void );int SetWorkConnectionInit( int mem_use){	cWork = ( struct connection *) calloc( 1, MAXWORKCONNECTION * sizeof( struct connection ));    if( cWork == NULL ){        //free( wb );        return 0;    } else {        int i;        for( i=0; i<MAXWORKCONNECTION; i++){            cWork[i].use = 0;            cWork[i].fd = -1;        }    }	return 1;}int tcpstruct_work_accept( int *tis , int ticount ){    int i,j;    int sret;    int accepted = 0;    struct timeval t;	char tmpbuf[256];    fd_set rfds, wfds , efds;  	FD_ZERO( &rfds );    FD_ZERO( &wfds );    FD_ZERO( &efds );        select_timeout.tv_sec = 0;    select_timeout.tv_usec = 0;    for( i=0; i<MAXWORKCONNECTION; i++){        if( cWork[i].use && cWork[i].fd >= 0 && cWork[i].closed_by_remote ==0 ){            FD_SET( cWork[i].fd , & rfds );            FD_SET( cWork[i].fd , & wfds );            FD_SET( cWork[i].fd , & efds );        }    }    t = select_timeout;    sret = select( 1024, & rfds , (fd_set*)NULL, & efds , &t);	if( sret > 0 ) {		for(i=0;i< MAXWORKCONNECTION;i++){			if( cWork[i].use && ( cWork[i].fd >= 0 ) && FD_ISSET( cWork[i].fd , &rfds ) ){				int rr , readsize ;				readsize = sizeof( tmpbuf);				memset( tmpbuf, 0, sizeof( tmpbuf));				rr = read( cWork[i].fd , tmpbuf , readsize );				if( rr <= 0 ){					cWork[i].closed_by_remote = 1;				} else {					MEMBuffer_AddWkReadBuffer( i, tmpbuf, WK_R);				}			}		}	}    t = select_timeout;        sret = select( 1024 , (fd_set*)NULL, &wfds, & efds , &t);	if( sret > 0 ) {		for(i=0;i<MAXWORKCONNECTION;i++){			if( cWork[i].use && ( cWork[i].fd >= 0 ) && FD_ISSET( cWork[i].fd , &wfds )){				int rr;				memset( tmpbuf, 0, sizeof( tmpbuf));				if( MEMBuffer_getWkLineReadBuffer( i, tmpbuf, sizeof( tmpbuf), WK_W) <= 0 )					continue;				rr = write( cWork[i].fd , tmpbuf , strlen(tmpbuf) );				if( rr <= 0 ){					cWork[i].closed_by_remote = 1;				}else	{				}			}		}	}    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( worksockfd , & rfds );        FD_SET( worksockfd , & wfds );        FD_SET( worksockfd , & efds );        asret = select( 1024, &rfds , &wfds , &efds, &t );        //if( FD_ISSET( worksockfd , & rfds )){		if( (asret>0) && FD_ISSET( worksockfd , & rfds )){            struct sockaddr_in c;            int len , newsockfd;            int newcon;            bzero( &c , sizeof( c ));            len = sizeof( c );			newcon = FindWorkRegBlankCon();            //newcon = FindWorkRegBlankCon( );            if( newcon < 0 ){				continue;			}            newsockfd = accept( worksockfd , (struct sockaddr*)&c , &len );			            if( newsockfd < 0 ){//              UnWorkRegMemBuf( newcon );                continue;            }			if( MAXWK <= findWk ) continue;            set_nodelay( newsockfd );            cWork[newcon].fd = newsockfd;            memcpy( &cWork[newcon].remoteaddr , &c ,sizeof(c));            tis[accepted] = newcon;			//andy_add			for( j=0; j<MAXWK; j++)	{				findWk++;				if( findWk >= MAXWK ) findWk=0;				if( wk[findWk].use != 1 && wk[findWk].fd < 0 )	{					wk[findWk].status = WKSTAT_IDLE;					wk[findWk].use = 1;					wk[findWk].ti = newcon;					wk[findWk].fd = newsockfd;					log( "同意工作: sockfd:%d,newfd:%d=aWork:%d\n" , worksockfd, newsockfd, findWk);					break;				}			}            accepted ++;        }    }    return accepted;}int cWork_write( int ti , char *buf , int len ){    if( ti < 0 || ti >= MAXWORKCONNECTION || cWork[ti].use == 0 )        return TCPSTRUCT_EINVCIND; 	return MEMBuffer_AddWkReadBuffer( ti, buf, WK_W);}int Work_close( int ti ){    if( ti < 0 || ti >= MAXWORKCONNECTION )return TCPSTRUCT_EINVCIND;    if( cWork[ti].use == 0 ){        return TCPSTRUCT_ECLOSEAGAIN;    }    close( cWork[ti].fd );    cWork[ti].use = 0;    cWork[ti].fd = -1;	MEMBuffer_clean( ti);    cWork[ti].mbtop_ri = -1;    cWork[ti].mbtop_wi = -1;	    return OK;}#endifMEMBuffers memBuf[MAXWORKCONNECTION]; //30void MEMBuffer_Init(){	int i;	for( i=0; i<MAXWORKCONNECTION; i++)	{		memset( memBuf[i].buff, 0, sizeof( memBuf[i].buff));		memBuf[i].use = 0;		memBuf[i].WR =-1;	}}int MEMBuffer_AddWkReadBuffer( int ti, char *data, int flg){	if( !memBuf[ti].use ) return -1;//flg = 1 r flg = 2 w	if( memBuf[ti].WR != -1 ) return -1;	memset( memBuf[ti].buff, 0, sizeof( memBuf[ti].buff));	if( strlen( data) > sizeof( memBuf[ti].buff) ) return -1;	memcpy( memBuf[ti].buff, data, strlen( data)+1);	memBuf[ti].WR = flg;	return 1;}int MEMBuffer_getWkLineReadBuffer( int ti, char *data, int sizes, int flg){	if( !memBuf[ti].use ) return -1;	if( memBuf[ti].WR != flg )return -1;	if( sizes < sizeof( memBuf[ti].buff) ){		memBuf[ti].WR = -1;		memset( memBuf[ti].buff, 0, sizeof( memBuf[ti].buff));		return -1;	}	memcpy( data, memBuf[ti].buff, sizeof( memBuf[ti].buff));	memBuf[ti].WR = -1;	memset( memBuf[ti].buff, 0, sizeof( memBuf[ti].buff));	return 1;}void MEMBuffer_clean( int ti){	memset( memBuf[ti].buff, 0, sizeof( memBuf[ti].buff) );	memBuf[ti].use = 0;	memBuf[ti].WR =-1;}int MEMBuffer_Find( int ti){	if( !memBuf[ti].use ){		memBuf[ti].use = 1;		memBuf[ti].WR =-1;		return 1;	}	return -1;}int FindWorkRegBlankCon( void ){    int i;    for(i=0;i<MAXWORKCONNECTION;i++){        if( cWork[i].use == 0 ){			if( MEMBuffer_Find( i) <= 0 )	continue;            cWork[i].use = 1;            cWork[i].fd = -1;            return i;        }    }    return TCPSTRUCT_ECFULL;}

⌨️ 快捷键说明

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