青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

woaidongmao

文章均收錄自他人博客,但不喜標(biāo)題前加-[轉(zhuǎn)貼],因其丑陋,見(jiàn)諒!~
隨筆 - 1469, 文章 - 0, 評(píng)論 - 661, 引用 - 0
數(shù)據(jù)加載中……

ACE高效PROACTOR編程框架一ClientHandle

2008-04-02 23:24

1、WIN32下面用proactor可以達(dá)到幾乎RAW IOCP的效率,由于封裝關(guān)系,應(yīng)該是差那么一點(diǎn)。

客戶端處理類的常規(guī)寫(xiě)法:
//處理客戶端連接消息
class ClientHandler : public ACE_Service_Handler
{
public:
/**構(gòu)造函數(shù)
*
*
*/
ClientHandler(unsigned int client_recv_buf_size=SERVER_CLIENT_RECEIVE_BUF_SIZE)
   :_read_msg_block(client_recv_buf_size),_io_count(0)
{
}

~ClientHandler(){}

/**
*初始化,因?yàn)榭赡芤玫紺lientHandler內(nèi)存池,而這個(gè)池又不一定要用NEW
*/
void init();

/**清理函數(shù),因?yàn)榭赡芤玫絻?nèi)存池
*
*/
void fini();

//檢查是否超時(shí)的函數(shù)

void check_time_out(time_t cur_time);

public:

/**客戶端連接服務(wù)器成功后調(diào)用
*
* \param handle 套接字句柄
* \param &message_block 第一次讀到的數(shù)據(jù)(未用)
*/

//由Acceptor來(lái)調(diào)用!!!
virtual void open (ACE_HANDLE handle,ACE_Message_Block &message_block);

/**處理網(wǎng)絡(luò)讀操作結(jié)束消息
*
* \param &result 讀操作結(jié)果
*/
virtual void handle_read_stream (const ACE_Asynch_Read_Stream::Result &result);

/**處理網(wǎng)絡(luò)寫(xiě)操作結(jié)束消息
*
* \param &result 寫(xiě)操作結(jié)果
*/
virtual void handle_write_stream (const ACE_Asynch_Write_Stream::Result &result);

private:

//**生成一個(gè)網(wǎng)絡(luò)讀請(qǐng)求
*
* \param void
* \return 0-成功,-1失敗
*/
int initiate_read_stream (void);

/**生成一個(gè)寫(xiě)請(qǐng)求
*
* \param mb 待發(fā)送的數(shù)據(jù)
* \param nBytes 待發(fā)送數(shù)據(jù)大小
* \return 0-成功,-1失敗
*/
int initiate_write_stream (ACE_Message_Block & mb, size_t nBytes );
/**
*
* \return 檢查是否可以刪除,用的是一個(gè)引用計(jì)數(shù)。每一個(gè)外出IO的時(shí)候+1,每一個(gè)IO成功后-1
*/
int check_destroy();
//異步讀
ACE_Asynch_Read_Stream _rs;

//異步寫(xiě)
ACE_Asynch_Write_Stream _ws;

//接收緩沖區(qū)只要一個(gè)就夠了,因?yàn)閴焊蜎](méi)想過(guò)要多讀,我直到現(xiàn)在也不是很清楚為什么要多讀,多讀的話要考慮很多問(wèn)題
ACE_Message_Block _read_msg_block;

//套接字句柄,這個(gè)可以不要了,因?yàn)榛惥陀袀€(gè)HANDLER在里面的。
//ACE_HANDLE _handle;

//一個(gè)鎖,客戶端反正有東東要鎖的,注意,要用ACE_Recursive_Thread_Mutex而不是用ACE_Thread_Mutex,這里面是可以重入的,而且在WIN32下是直接的EnterCriticalSection,可以達(dá)到很高的效率
ACE_Recursive_Thread_Mutex _lock;
//在外IO數(shù)量,其實(shí)就是引用計(jì)數(shù)啦,沒(méi)啥的。為0的時(shí)候就把這個(gè)東東關(guān)掉啦。
long _io_count;

//檢查超時(shí)用的,過(guò)段時(shí)間沒(méi)東東就CLOSE他了。

time_t _last_net_io;

private:

//本來(lái)想用另外一種模型的,只用1個(gè)或者2個(gè)外出讀,后來(lái)想想,反正一般內(nèi)存都是足夠的,就不管了。

//ACE_Message_Block _send_msg_blocks[2];

//ACE_Message_Block &_sending_msg_block;

//ACE_Message_Block &_idle_msg_block;

private:
public:
//TODO:move to prriva and use friend class!!!

//只是為了效率更高,不用STL的LIST是因?yàn)榈浆F(xiàn)在我沒(méi)有可用的Node_Allocator,所以效率上會(huì)有問(wèn)題。
ClientHandler *_next;

ClientHandler *next(){return _next;}

void next(ClientHandler *obj){_next=obj;}

};

//這是具體實(shí)現(xiàn),有些地方比較亂,懶得管了,鎖的有些地方不對(duì)。懶得改了,反正在出錯(cuò)或者有瓶頸的時(shí)候再做也不遲。

void ClientHandler::handle_read_stream (const ACE_Asynch_Read_Stream::Result &result)
{
_last_net_io=ACE_OS::time(NULL);
int byterecved=result.bytes_transferred ();
if ( (result.success ()) && (byterecved != 0))
{
   //ACE_DEBUG ((LM_DEBUG, "Receiver completed:%d\n",byterecved));

//處理完數(shù)據(jù)
   if(handle_received_data()==true)
   {
    //ACE_DEBUG ((LM_DEBUG, "go on reading...\n"));

//把東東推到頭部,處理粘包
    _read_msg_block.crunch();
    initiate_read_stream();
   }
}

//這個(gè)地方不想用ACE_Atom_op,因?yàn)榉凑幸粋€(gè)鎖,而且一般都會(huì)用鎖,不管了。假如不在意的話,應(yīng)該直接用ACE_Atom_Op以達(dá)到最好的效率

{
   ACE_Guard<ACE_Recursive_Thread_Mutex> locker (_lock);
   _io_count--;
}
check_destroy ();
}

void ClientHandler::init()
{

//初始化數(shù)據(jù),并不在構(gòu)造函數(shù)里做。
_last_net_io=ACE_OS::time(NULL);
_read_msg_block.rd_ptr(_read_msg_block.base());
_read_msg_block.wr_ptr(_read_msg_block.base());
this->handle(ACE_INVALID_HANDLE);
}

bool ClientHandler::handle_received_data()
{

...........自己處理
return true;
}

//==================================================================
void ClientHandler::handle_write_stream (const ACE_Asynch_Write_Stream::Result &result)
{
//發(fā)送成功,RELEASE掉
//這個(gè)不可能有多個(gè)RELEASE,直接X(jué)X掉
//result.message_block ().release ();
MsgBlockManager::get_instance().release_msg_block(&result.message_block());

{
   ACE_Guard<ACE_Recursive_Thread_Mutex> locker (_lock);
   _io_count--;
}
check_destroy ();
}

//bool ClientHandler::destroy ()
//{
// FUNC_ENTER;
// ClientManager::get_instance().release_client_handle(this);
// FUNC_LEAVE;
// return false ;
//}

int ClientHandler::initiate_read_stream (void)
{
ACE_Guard<ACE_Recursive_Thread_Mutex> locker (_lock);

//考慮到粘包的呀
if (_rs.read (_read_msg_block, _read_msg_block.space()) == -1)
{
   ACE_ERROR_RETURN ((LM_ERROR,"%p\n","ACE_Asynch_Read_Stream::read"),-1);
}
_io_count++;
return 0;
}

/**生成一個(gè)寫(xiě)請(qǐng)求
*
* \param mb 待發(fā)送的數(shù)據(jù)
* \param nBytes 待發(fā)送數(shù)據(jù)大小
* \return 0-成功,-1失敗
*/
int ClientHandler::initiate_write_stream (ACE_Message_Block & mb, size_t nBytes )
{
ACE_Guard<ACE_Recursive_Thread_Mutex> locker (_lock);
if (_ws.write (mb , nBytes ) == -1)
{
   mb.release ();
   ACE_ERROR_RETURN((LM_ERROR,"%p\n","ACE_Asynch_Write_File::write"),-1);
}
_io_count++;
return 0;
}

void ClientHandler::open (ACE_HANDLE handle,ACE_Message_Block &message_block)
{
//FUNC_ENTER;
_last_net_io=ACE_OS::time(NULL);
_io_count=0;
if(_ws.open(*this,this->handle())==-1)
{
   ACE_ERROR ((LM_ERROR,"%p\n","ACE_Asynch_Write_Stream::open"));
}
else if (_rs.open (*this, this->handle()) == -1)
{
   ACE_ERROR ((LM_ERROR,"%p\n","ACE_Asynch_Read_Stream::open"));
}
else
{
   initiate_read_stream ();
}

check_destroy();
//FUNC_LEAVE;
}

void ClientHandler::fini()
{
}

void ClientHandler::check_time_out(time_t cur_time)
{
//ACE_Guard<ACE_Recursive_Thread_Mutex> locker (_lock);
//ACE_DEBUG((LM_DEBUG,"cur_time is %u,last io is %u\n",cur_time,_last_net_io));

//檢測(cè)是否已經(jīng)為0了
if(this->handle()==ACE_INVALID_HANDLE)
   return;
if(cur_time-_last_net_io>CLIENT_TIME_OUT_SECONDS)
{
   ACE_OS::shutdown(this->handle(),SD_BOTH);
   ACE_OS::closesocket(this->handle());
   this->handle(ACE_INVALID_HANDLE);
}
}

int ClientHandler::check_destroy()
{
{
   ACE_Guard<ACE_Recursive_Thread_Mutex> locker (_lock);
   if (_io_count> 0)
    return 1;
}
ACE_OS::shutdown(this->handle(),SD_BOTH);
ACE_OS::closesocket(this->handle());
this->handle(ACE_INVALID_HANDLE);

//這個(gè)地方給內(nèi)存池吧。
ClientManager::get_instance().release_client_handle(this);
//delete this;
return 0;
}

posted on 2008-04-18 20:47 肥仔 閱讀(685) 評(píng)論(0)  編輯 收藏 引用 所屬分類: 網(wǎng)絡(luò)編程

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            99在线视频精品| 极品裸体白嫩激情啪啪国产精品| 欧美高清视频一二三区| 亚洲黄色成人久久久| 在线观看欧美黄色| 国产精品自拍小视频| 欧美三区视频| 欧美日韩免费观看一区=区三区| 亚洲少妇诱惑| 亚洲男女自偷自拍| 欧美高清hd18日本| 欧美波霸影院| 一区二区三区成人精品| 亚洲国产免费看| 最新国产精品拍自在线播放| 玖玖精品视频| 牛夜精品久久久久久久99黑人| 欧美成人午夜激情| 久久久精品五月天| 一本色道精品久久一区二区三区| 亚洲欧洲在线播放| 亚洲精品一级| 亚洲免费在线精品一区| 性欧美videos另类喷潮| 欧美中文字幕视频| 久久免费黄色| 牛人盗摄一区二区三区视频| 黄色资源网久久资源365| 一本色道精品久久一区二区三区| 国产精品99久久久久久久女警| 午夜精品福利在线观看| 久久在线免费观看视频| 欧美成人一区在线| 亚洲二区在线| 久久人体大胆视频| 欧美伊人久久| 欧美日韩国产精品一区| 在线播放中文一区| 欧美一区二区在线观看| 欧美韩日高清| 久久精品欧洲| 欧美日韩一区二区高清| 国产视频一区免费看| 亚洲一区三区在线观看| 亚洲伦理精品| 欧美日韩亚洲视频| 这里只有精品电影| 亚洲国产精品热久久| 欧美亚洲视频| 国产精品视频午夜| 狠狠综合久久av一区二区小说| 久久xxxx精品视频| 99re8这里有精品热视频免费| 老司机精品视频网站| 国产欧美精品xxxx另类| 亚洲欧美一区二区原创| 亚洲国产精品一区制服丝袜| 国产精品成人aaaaa网站| 午夜视频一区二区| 久久精品人人做人人爽| 亚洲精品永久免费精品| 亚洲人永久免费| 欧美人与性动交a欧美精品| 99热免费精品| 免费成人你懂的| 欧美在线播放| 久久精品国产欧美激情| 亚洲高清资源| 亚洲——在线| 国外成人性视频| 免费在线国产精品| 亚洲国产精品热久久| 性欧美大战久久久久久久免费观看 | 欧美一区免费| 欧美激情国产精品| 久久久久久婷| 欧美日韩一区自拍| 久久精品亚洲热| 亚洲激情综合| 国产精品亚洲一区| 亚洲免费观看| 亚洲国产一区二区a毛片| 午夜免费久久久久| 欧美一区二区精美| 欧美日韩午夜精品| 欧美日韩专区在线| 亚洲三级性片| 99re8这里有精品热视频免费| 亚洲精品一区二区三区樱花| 一区在线影院| 午夜精品成人在线| 亚洲欧美日韩国产中文在线| 欧美日本一区二区三区| 亚洲一区二区四区| 亚洲男人天堂2024| 欧美激情久久久久| 亚洲日本电影| 亚洲天堂免费观看| 亚洲精品久久| 欧美日韩国产综合久久| 亚洲第一色中文字幕| 亚洲区欧美区| 欧美高清视频一二三区| 欧美激情精品久久久久| 亚洲社区在线观看| 国产一区高清视频| 欧美视频一区二区| 午夜亚洲福利在线老司机| 午夜精品久久久久久99热| 亚洲自拍偷拍色片视频| 亚洲国产精品一区| 国产精品区一区| 欧美国产第二页| 香蕉av福利精品导航| 亚洲激情网址| 亚洲免费成人av| 欧美国产一区二区三区激情无套| 99视频+国产日韩欧美| 影音先锋另类| 欧美午夜免费电影| 亚洲欧美国产精品桃花| 久久青草福利网站| 欧美v日韩v国产v| 久久天堂国产精品| 亚洲午夜电影网| 亚洲国产精品黑人久久久| 欧美色欧美亚洲另类七区| 国产乱肥老妇国产一区二 | 欧美成人中文| 欧美a级一区| 久久久欧美一区二区| 亚洲已满18点击进入久久| 久久精品论坛| 亚洲欧美日韩国产精品| 性亚洲最疯狂xxxx高清| 亚洲精品免费看| 亚洲人成在线播放| 在线观看日韩av先锋影音电影院| 久久综合久久综合九色| 久久精品免费播放| 欧美激情亚洲自拍| 亚洲一区二区三区高清不卡| 欧美一区二区精品在线| 另类激情亚洲| 亚洲视频第一页| 欧美不卡视频一区发布| 亚洲大胆人体视频| 亚洲欧美日韩国产综合精品二区| 免费日韩视频| 国产有码在线一区二区视频| 一区二区欧美精品| 亚洲国产精品国自产拍av秋霞| 亚洲一区二区黄| 国产精品白丝av嫩草影院 | 久久久国产精彩视频美女艺术照福利| 欧美精品在线看| 亚洲已满18点击进入久久| 一区二区三区鲁丝不卡| av不卡在线看| 国产精品v欧美精品v日韩| 欧美一级视频免费在线观看| 国产午夜亚洲精品不卡| 国内久久精品| 亚洲人成绝费网站色www| 亚洲人成艺术| 亚洲精品护士| 欧美激情一区二区三区| 久久精品官网| 国产欧美一区二区精品忘忧草| 亚洲欧美视频在线观看| 亚洲欧美日韩一区在线| 欧美特黄一级大片| 久久精品夜色噜噜亚洲a∨| 久久久www成人免费无遮挡大片| 国产精品一区二区久久久| 亚洲欧美日韩国产综合在线| 亚洲欧美激情四射在线日| 韩国三级电影一区二区| 欧美在线视频一区二区| 欧美高清在线精品一区| 亚洲欧美日韩区| 久久黄色网页| 亚洲免费播放| 久久免费国产精品| 一本色道久久综合狠狠躁的推荐| 亚洲人成网站精品片在线观看 | 国产精品99久久久久久人| 夜夜嗨av一区二区三区免费区| 欧美视频在线一区| 欧美国产视频一区二区| 国产日韩欧美三级| 欧美专区在线播放| 久久黄色影院| 国产精品美女在线| 亚洲第一页在线| 国产亚洲精久久久久久| 亚洲视屏在线播放| 欧美中日韩免费视频| 欧美理论电影网| 中文av字幕一区|