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

📄 server.cpp

📁 自动调整大小的进程池类的实现。 一个运用进程池的server类。 一个socket类。
💻 CPP
字号:

#include "server.h"
Server::Server( const char * port,SimpleLog &logfile ):ProcPool(logfile)
{
	_port=string(port);
	_server=new ServerSocket(port);
	assert(_server!=NULL);
	__logfile->Userlog(DEBUG,"in server default constructor,port[%s]",port);
} 

Server::Server( const char * port,SimpleLog &logfile,int& max,int& init,int &low,int& high,int& inc,int& dec ):ProcPool(logfile,max,init,low,high,inc,dec)
{
	_port=string(port);
	_server=new ServerSocket(port);
	assert(_server!=NULL);
	__logfile->Userlog(DEBUG,"in server  constructor with 7 param,port[%s]",port);
}

Server::Server( const char * port,SimpleLog &logfile,int& max,int& init,int &low,int& high,int& inc,int& dec,int &timeout ):ProcPool(logfile,max,init,low,high,inc,dec,timeout)
{
	_port=string(port);
	_server=new ServerSocket(port);
	assert(_server!=NULL);
	__logfile->Userlog(DEBUG,"in server  constructor with 8 param,port[%s]",port);
}

void *Server::WaitTask( )
{
	//cout<<"wait task"<<endl;
	//锁定套结字
	if(!_acceptlock->lock( ))
	{
		//cout<<"lock"<<endl;
		__logfile->Userlog(DEBUG,"in wait task,lock socket error");
		return NULL;
	}
	//接收连接
	//cout<<"before accepr"<<endl;
	Socket *sock=_server->accept_connect( );
	//cout<<"after accepr"<<endl;
	_acceptlock->unlock( );
	
	if( sock )
	__logfile->Userlog(DEBUG,"Client [%s] connect...",_server->client_ip( ).c_str( ));
	return sock;
}

bool Server::doTask(void *task )
{
	//cout<<"do task"<<endl;
	Socket *sock= static_cast<Socket *>(task);
	char buffer[MAXBUFFERSIZE];
	memset(buffer,0,sizeof(buffer));
	int recv_len=0;
	if( (recv_len=sock->receive(buffer,MAXBUFFERSIZE-1,TIMEOUT)) < 0)
	{
		__logfile->Userlog(ERROR,"Client [%s] recv error[%s]",_server->client_ip( ).c_str( ),strerror(errno));
		delete sock;
		return false;
	}
	if(!AuthorizeClient(buffer,recv_len))
	{
		__logfile->Userlog(ERROR,"Client [%s] auhorize error",_server->client_ip( ).c_str( ));
		delete sock;
		return false;
	}
	//record what receive
	if(buffer[recv_len]=='\0')
		__logfile->Userlog(INFO,"Client[%s]recv:[%s]",_server->client_ip( ).c_str( ),buffer);
	else
	{
		string logString;
		char logInfo[5];
		for( int i=0;i<recv_len;i++)
		{
			sprintf( logInfo,"[%02x]",logInfo[i] );
			logString+=logInfo;
		}
		__logfile->Userlog(INFO,"Client[%s]recv:[%s]",_server->client_ip( ).c_str( ),logString.c_str( ));
	}
	
	//此处需要添加对接收到的数据进行处理的程序
	//--------------------------------------------
	
	
	//--------------------------------------------
	char back[10];
	sprintf(back,"%s","OK");
	__logfile->Userlog(INFO,"Client[%s]send:[%s]",_server->client_ip( ).c_str( ),back );
	sock->Send(back,strlen(back));
	//cout<<"Task is over"<<endl;
	delete sock;
	return true;
}

bool Server::Init( )
{
	__logfile->Userlog(DEBUG,"in server init");
	//cout<<"in bankserver init"<<endl;
	return IncreaseChld(InitNum);
}

bool Server::AuthorizeClient( char *recv,int& len)
{
	if(len<=0)
		return false;
	for(int i=0;i<len;i++)
	 if(recv[i]=='\0')
	 	recv[i]='\n';
	 	
	 cout<<_server->client_ip( )<<"校验完成"<<endl;
	 __logfile->Userlog(DEBUG,"Client[%s] authorize over",_server->client_ip( ).c_str( ));
	 return true;
}

⌨️ 快捷键说明

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