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

woaidongmao

文章均收錄自他人博客,但不喜標題前加-[轉貼],因其丑陋,見諒!~
隨筆 - 1469, 文章 - 0, 評論 - 661, 引用 - 0
數據加載中……

ACE高效PROACTOR編程框架一ClientHandle

2008-04-02 23:24

1、WIN32下面用proactor可以達到幾乎RAW IOCP的效率,由于封裝關系,應該是差那么一點。

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

~ClientHandler(){}

/**
*初始化,因為可能要用到ClientHandler內存池,而這個池又不一定要用NEW
*/
void init();

/**清理函數,因為可能要用到內存池
*
*/
void fini();

//檢查是否超時的函數

void check_time_out(time_t cur_time);

public:

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

//由Acceptor來調用!!!
virtual void open (ACE_HANDLE handle,ACE_Message_Block &message_block);

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

/**處理網絡寫操作結束消息
*
* \param &result 寫操作結果
*/
virtual void handle_write_stream (const ACE_Asynch_Write_Stream::Result &result);

private:

//**生成一個網絡讀請求
*
* \param void
* \return 0-成功,-1失敗
*/
int initiate_read_stream (void);

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

//異步寫
ACE_Asynch_Write_Stream _ws;

//接收緩沖區只要一個就夠了,因為壓根就沒想過要多讀,我直到現在也不是很清楚為什么要多讀,多讀的話要考慮很多問題
ACE_Message_Block _read_msg_block;

//套接字句柄,這個可以不要了,因為基類就有個HANDLER在里面的。
//ACE_HANDLE _handle;

//一個鎖,客戶端反正有東東要鎖的,注意,要用ACE_Recursive_Thread_Mutex而不是用ACE_Thread_Mutex,這里面是可以重入的,而且在WIN32下是直接的EnterCriticalSection,可以達到很高的效率
ACE_Recursive_Thread_Mutex _lock;
//在外IO數量,其實就是引用計數啦,沒啥的。為0的時候就把這個東東關掉啦。
long _io_count;

//檢查超時用的,過段時間沒東東就CLOSE他了。

time_t _last_net_io;

private:

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

//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是因為到現在我沒有可用的Node_Allocator,所以效率上會有問題。
ClientHandler *_next;

ClientHandler *next(){return _next;}

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

};

//這是具體實現,有些地方比較亂,懶得管了,鎖的有些地方不對。懶得改了,反正在出錯或者有瓶頸的時候再做也不遲。

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));

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

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

//這個地方不想用ACE_Atom_op,因為反正要有一個鎖,而且一般都會用鎖,不管了。假如不在意的話,應該直接用ACE_Atom_Op以達到最好的效率

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

void ClientHandler::init()
{

//初始化數據,并不在構造函數里做。
_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)
{
//發送成功,RELEASE掉
//這個不可能有多個RELEASE,直接XX掉
//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;
}

/**生成一個寫請求
*
* \param mb 待發送的數據
* \param nBytes 待發送數據大小
* \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));

//檢測是否已經為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);

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

posted on 2008-04-18 20:47 肥仔 閱讀(689) 評論(0)  編輯 收藏 引用 所屬分類: 網絡編程

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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亚洲伊人久久精品影院红桃| 欧美日韩精品在线视频| 久久精品亚洲| 国产一区二区精品久久99| 亚洲影音一区| 午夜免费在线观看精品视频| 国产一区二区在线观看免费播放| 久久福利电影| 欧美国产免费| 免费短视频成人日韩| 亚洲高清二区| 亚洲一区二区伦理| 亚洲国产精品第一区二区三区| 亚洲精品视频一区| 国产一区二区三区黄| 日韩视频一区| 亚洲精品黄色| 久久久无码精品亚洲日韩按摩| 一区二区不卡在线视频 午夜欧美不卡在 | 欧美日一区二区三区在线观看国产免| 一区二区欧美亚洲| 久久综合网络一区二区| 亚洲一区黄色| 欧美二区在线观看| 久久久福利视频| 国产精品毛片在线看| 亚洲激情av| 国产亚洲午夜| 欧美在线资源| 美女国内精品自产拍在线播放| 国产欧美一区二区精品忘忧草| 夜夜精品视频一区二区| 在线亚洲一区| 欧美日韩一区成人| 一区二区三区四区五区精品| 亚洲婷婷在线| 国产日韩欧美成人| 午夜精品一区二区三区电影天堂| 亚洲一级片在线看| 国产精品视频1区| 午夜精品福利一区二区三区av | 亚洲午夜未删减在线观看| 欧美人成免费网站| 亚洲欧美视频在线观看视频| 欧美在线999| 亚洲电影免费在线观看| 牛牛国产精品| 亚洲性视频网站| 久久影院午夜片一区| 亚洲九九精品| 国产亚洲精品综合一区91| 久久久青草青青国产亚洲免观| 亚洲精品一区在线| 久久午夜羞羞影院免费观看| 亚洲国产专区校园欧美| 国产精品一级| 欧美日韩p片| 久久综合伊人77777| 亚洲国产精品一区二区久| 亚洲欧美日韩天堂| 在线观看成人小视频| 欧美日韩日本国产亚洲在线| 性做久久久久久久久| 亚洲激情小视频| 欧美二区不卡| 男人的天堂亚洲| 久久国产精品久久久久久电车| 亚洲三级影院| 亚洲国产裸拍裸体视频在线观看乱了中文 | 欧美精品在线一区二区三区| 国产精品99久久久久久久女警| 模特精品在线| 欧美高清免费| 亚洲黄色免费| 亚洲成色精品| 国产一区二区三区免费观看| 欧美精品日韩一区| 久久只有精品| 免费久久99精品国产自在现线| 久久久久国产一区二区| 久久亚洲国产精品日日av夜夜| 亚洲在线观看免费| 久久er精品视频| 欧美一区二区三区精品| 久久狠狠婷婷| 欧美精品www| 国产精品美女午夜av| 国产日韩精品电影| 亚洲黄网站在线观看| 9l国产精品久久久久麻豆| 亚洲午夜精品网| 久久成人av少妇免费| 久久只精品国产| 亚洲激情自拍| 亚洲欧美日韩国产成人| 久久狠狠亚洲综合| 你懂的一区二区| 国产日韩一区| 一区二区福利| 欧美激情欧美激情在线五月| 99国产精品| 麻豆国产精品一区二区三区| 欧美日韩亚洲一区二区三区在线观看 | 先锋影音网一区二区| 欧美91精品| 久久精品一二三| 欧美啪啪一区| 在线看片第一页欧美| 欧美中文字幕第一页| 99国产精品久久久久久久成人热 | 亚洲欧美久久久久一区二区三区| 久久精品人人做人人爽电影蜜月| 欧美日韩一区二区三区高清| 亚洲第一福利社区| 久久久精品日韩欧美| 亚洲视频在线视频| 国产精品欧美经典| 性欧美8khd高清极品| 亚洲综合好骚| 国产亚洲激情在线| 久久免费视频在线| 久久久国际精品| 亚洲国产视频直播| 欧美华人在线视频| 欧美女激情福利| 亚洲精品国产精品乱码不99按摩 | 久久午夜av| 久久久噜噜噜久久| 亚洲精品亚洲人成人网| 99精品国产在热久久下载| 欧美日韩国产精品一卡| 亚洲欧美一区二区三区在线| 午夜精品久久久久久久白皮肤| 国产农村妇女毛片精品久久麻豆| 久久经典综合| 久久久久五月天| 在线视频日韩精品| 久久精品男女| 亚洲欧美精品在线观看| 亚洲自拍都市欧美小说| 国内精品福利| 一区二区三区四区国产| 精品69视频一区二区三区| 亚洲国内高清视频| 国产免费亚洲高清| 欧美激情在线免费观看| 国产精品成人一区二区网站软件 | 国产欧美日韩一级| 亚洲人成网站影音先锋播放| 国产性天天综合网| 亚洲人永久免费| 亚洲高清视频在线观看| 亚洲一区免费视频| 亚洲网在线观看| 欧美成人日韩| 亚洲国产美女久久久久| 国产一区二区毛片| 亚洲一区二区三区视频| 在线一区欧美| 国产精品美女久久久久av超清| 亚洲第一中文字幕在线观看| 国产亚洲欧美日韩在线一区| 中文久久精品| 欧美一级片在线播放| 国产精品一级二级三级| 午夜精品久久久久久久久久久久 | 亚洲人成人一区二区三区| 午夜日韩电影| 欧美电影电视剧在线观看| 黄色成人在线观看| 美女91精品| 日韩午夜在线电影| 欧美影院在线播放| 国产一区二区久久精品| 久久在线免费观看视频| 日韩视频二区| 久久精品国产99国产精品| 1024精品一区二区三区| 欧美激情精品久久久久久大尺度| 99精品国产热久久91蜜凸| 久久av一区二区| 在线视频亚洲欧美| 国产网站欧美日韩免费精品在线观看 | 亚洲视频第一页| 久久精品一区四区| 日韩一级精品视频在线观看| 国产精品一区二区三区观看 | 午夜精品久久久久久久蜜桃app| 国产一区二区三区黄| 欧美日韩国产999| 乱人伦精品视频在线观看| 亚洲欧美日韩区| 一区二区免费在线观看| 亚洲国产老妈| 欧美成人高清| 久久久久综合一区二区三区| 亚洲影音一区| 亚洲欧美一区在线| 中文成人激情娱乐网| 99re6这里只有精品|