89 lines
2.5 KiB
C
89 lines
2.5 KiB
C
|
#ifndef HGL_NETWORK_MULTI_THREAD_ACCEPT_INCLUDE
|
|||
|
#define HGL_NETWORK_MULTI_THREAD_ACCEPT_INCLUDE
|
|||
|
|
|||
|
#include<hgl/thread/Thread.h>
|
|||
|
#include<hgl/type/Stack.h>
|
|||
|
#include<hgl/thread/Semaphore.h>
|
|||
|
namespace hgl
|
|||
|
{
|
|||
|
namespace network
|
|||
|
{
|
|||
|
class IPAddress;
|
|||
|
class AcceptServer;
|
|||
|
|
|||
|
using IPAddressStack=Stack<IPAddress *>;
|
|||
|
|
|||
|
/**
|
|||
|
* Socket接入线程
|
|||
|
*/
|
|||
|
class AcceptThread:public Thread
|
|||
|
{
|
|||
|
AcceptServer *server;
|
|||
|
Semaphore *active_semaphore;
|
|||
|
|
|||
|
protected:
|
|||
|
|
|||
|
IPAddressStack ip_stack; ///<IP地址空间堆栈,会提前分配好空间供未来使用
|
|||
|
|
|||
|
public:
|
|||
|
|
|||
|
AcceptThread(AcceptServer *,Semaphore *);
|
|||
|
virtual ~AcceptThread()=default;
|
|||
|
|
|||
|
bool Execute() override;
|
|||
|
|
|||
|
public:
|
|||
|
|
|||
|
/**
|
|||
|
* 接受一个接入
|
|||
|
* @param sock Socket值
|
|||
|
* @param addr ip地址(注:需自行delete)
|
|||
|
*/
|
|||
|
virtual bool OnAccept(int sock,IPAddress *addr)=0; ///<接入一个新Socket
|
|||
|
};//class AcceptThread:public Thread
|
|||
|
|
|||
|
/**
|
|||
|
* 多Socket接入线程管理模板
|
|||
|
*/
|
|||
|
template<typename ACCEPT_THREAD> class MultiThreadAccept
|
|||
|
{
|
|||
|
MultiThreadManage<ACCEPT_THREAD> accept_thread_manage;
|
|||
|
|
|||
|
Semaphore active_semaphore;
|
|||
|
|
|||
|
public:
|
|||
|
|
|||
|
virtual ~MultiThreadAccept()=default;
|
|||
|
|
|||
|
bool Init(AcceptServer *server,const uint thread_count)
|
|||
|
{
|
|||
|
if(!server)return(false);
|
|||
|
if(thread_count<=0)return(false);
|
|||
|
|
|||
|
for(int i=0;i<thread_count;i++)
|
|||
|
accept_thread_manage.Add(new ACCEPT_THREAD(server,&active_semaphore));
|
|||
|
|
|||
|
return(true);
|
|||
|
}
|
|||
|
|
|||
|
ACCEPT_THREAD *GetAcceptThread(const int index)
|
|||
|
{
|
|||
|
return accept_thread_manage.GetThread(index);
|
|||
|
}
|
|||
|
|
|||
|
bool Start (){return accept_thread_manage.Start()>0;}
|
|||
|
int IsLive (){return accept_thread_manage.IsLive();}
|
|||
|
bool Close (){return accept_thread_manage.Close();}
|
|||
|
|
|||
|
/**
|
|||
|
* 等待接收信号
|
|||
|
*/
|
|||
|
bool Wait(const double &time_over=5)
|
|||
|
{
|
|||
|
return active_semaphore.Acquire(time_over);
|
|||
|
}
|
|||
|
};//template<typename ACCEPT_THREAD> class MultiThreadAccept
|
|||
|
}//namespace network
|
|||
|
}//namespace hgl
|
|||
|
#endif//HGL_NETWORK_MULTI_THREAD_ACCEPT_INCLUDE
|