2011年2月25日 星期五

用ACE練習寫個簡單的server class(中)

補上.cpp的程式碼

SBNet.cpp


CSBNet::CSBNet()
{
ACE::init();
Net = new SBaseNet();
}
CSBNet::~CSBNet()
{
ACE::fini();
}
bool CSBNet::Start(int scount)
{
return Net->Start(scount);
}
bool CSBNet::Start(int port,int scount)
{
return Net->Start(port,scount);
}
bool CSBNet::End(void)
{
return Net->End();
}
void CSBNet::Send(int id, char *data )
{
Net->Send(id, data);
}
char *CSBNet::Receive(void)
{
return Net->Receive();
}
上面就是將SBaseNet包裝起來

SBaseNet類別

SBaseNet::SBaseNet():Port(ACE_DEFAULT_SERVER_PORT)
{
}

SBaseNet::~SBaseNet()
{
}

bool SBaseNet::Start(int scount)
{
aio_acceptor.init_handlers(scount);
return this->activate();
}
bool SBaseNet::Start(int port, int scount)
{
Port = port;
aio_acceptor.init_handlers(scount);
return this->activate();
}

int SBaseNet::svc()
{
ACE_INET_Addr addr( Port );
if (0 != aio_acceptor.open (addr,0, 0, ACE_DEFAULT_ASYNCH_BACKLOG, 1, 0, 0))
ACE_ERROR_RETURN ((LM_ERROR, ACE_TEXT ("%p\n"), ACE_TEXT ("SBaseNet acceptor open")), 1);

ACE_DEBUG ((LM_DEBUG, ACE_TEXT("SBaseNet start\n")));
//ACE_Time_Value oHdlTime(1);
//while(run)
{
// oHdlTime = 1;
ACE_Proactor::instance()->proactor_run_event_loop();//oHdlTime);
}
ACE_DEBUG ((LM_DEBUG, ACE_TEXT("SBaseNet ended\n")));
return 0;

}

bool SBaseNet::End(void)
{
ACE_Proactor::instance()->proactor_end_event_loop();
this->wait();
aio_acceptor.Destroy();
return 0;
}

void SBaseNet::Send(int id, char *data )
{
aio_acceptor.ser[id].SendData(data);
}
char *SBaseNet::Receive(void)
{
return aio_acceptor.RQData.Receive();
}


接收資料的類別

RecvQueue::RecvQueue()
{
//this->msg_queue_->high_water_mark(655350);
}
RecvQueue::~RecvQueue()
{

}
int RecvQueue::open(void)
{
return this->activate();
}
int RecvQueue::close(void)
{
/*
ACE_Message_Block * hangup;
ACE_NEW_RETURN (hangup, ACE_Message_Block(0, ACE_Message_Block::MB_HANGUP), -1);
this->putq (hangup);
this->wait ();
*/
return 0;
}
char *RecvQueue::Receive( void )
{
ACE_Message_Block *message = NULL;
int result;
result = this->getq(message,(ACE_Time_Value *) &ACE_Time_Value::zero);

if( result > -1 && message )
{
CmdPacker *hdr = reinterpret_cast<CmdPacker *> (message->rd_ptr ());
//ACE_DEBUG((LM_DEBUG, ACE_TEXT("recv:%d %d %d %s\n",hdr->id,hdr->num,hdr->bsize, hdr->data)));
//ACE_DEBUG((LM_DEBUG, ACE_TEXT("recv:%d \n",hdr->id)));
ReadBuf[0] = (char)message->msg_type();
if( SBN_QUE_DATA == ReadBuf[0] )
memcpy(ReadBuf,(char*)hdr,16+hdr->bsize);
else
memcpy(ReadBuf,(char*)hdr,16);
message->release();
}
else
ReadBuf[0] = SBN_QUE_NONE;
return ReadBuf;
}

接下來剩HA_Proactive_Acceptor和HA_Proactive_Service,貼到下篇好了,不然這一堆程式碼,看得頭都昏了...

沒有留言:

張貼留言