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

Focus on ACE

訂閱 ace-china
電子郵件:
瀏覽存于 groups.google.com 上的所有帖子

C++博客 首頁 新隨筆 聯系 聚合 管理
  64 Posts :: 3 Stories :: 22 Comments :: 0 Trackbacks
用ACE靜態服務配置實現簡單的Echo服務
Stone Jiang (HuiHoo ace)

本例完善了AGP中的示例

用ACE寫靜態服務配置與寫動態服務配置一樣簡單.本例實際了一個簡單的Echo服務.還包含了如何從ini文件中讀取服務配置

ACE靜態服務配置演示
? 示例說明
??? 完善了AGP中19章的例子
??? 演示了如何用ACE實現靜態服務配置
? 項目文件
??? HA_Status.h/cpp 服務接口程序
??? ClientHandler.h/cpp 事件處理器
??? svc_conf.static???? 靜態服務配置文件
??? status.ini?????????
????? 服務配置文件,服務偵聽的端口放在這里面的
? 調試命令行參數
??? -f svc_conf.static -d

詳細實現代碼
main.cpp

//@file:?main.cpp
//???????靜態服務配置主函數
//@author:?StoneJiang<2005119@gmail.com>
//@version:?0.1.0

#include?
"ace/os.h"
#include?
"ace/Log_Msg.h"
#include?
"ace/Service_Config.h"
#include?
"ace/Reactor.h"

int?ACE_TMAIN(int?argc,?ACE_TCHAR*?argv[])
{
??ACE_DEBUG((LM_DEBUG,ACE_TEXT(
"啟動主函數\n")));
??ACE_STATIC_SVC_REGISTER?(HA_Status_Descriptor);
??ACE_Service_Config::open?(argc,
????argv,
????ACE_DEFAULT_LOGGER_KEY,
????
0);
??ACE_Reactor::instance?()
->run_reactor_event_loop?();
??
return?0;
}



HA_Status.h
//@file:?HA_Status.h
//???????服務接口類
#ifndef?HA_STATUS_H
#define?HA_STATUS_H
#include?
"ace/Service_Object.h"
#include?
"ace/INET_Addr.h"
#include?
"ace/Acceptor.h"
#include?
"ace/SOCK_Acceptor.h"
#include?
"ClientHandler.h"

class?HA_Status?:public?ACE_Service_Object
{
public:
??
virtual?int?init?(int?argc,?ACE_TCHAR?*argv[]);
??
virtual?int?fini?(void);
??
virtual?int?info?(ACE_TCHAR?**str,?size_t?len)?const;

private:
??ACE_Acceptor
<ClientHandler,?ACE_SOCK_ACCEPTOR>?acceptor_;
??ACE_INET_Addr?listen_addr_;

}
;
#endif

HA_Status.cpp

?

//@file:?HA_Status.cpp
//???????服務接口類的實現
#include?"HA_Status.h"
#include?
"ace/service_config.h"
#include?
"ace/OS_NS_stdio.h"
#include?
"ace/OS_NS_string.h"
#include?
"ace/Get_Opt.h"
#include?
"ace/Configuration.h"
#include?
"ace/Configuration_Import_Export.h"

int
HA_Status::init?(
int?argc,?ACE_TCHAR?*argv[])
{
??
static?const?ACE_TCHAR?options[]?=?ACE_TEXT?(":f:");
??ACE_Get_Opt?cmd_opts?(argc,?argv,?options,?
0);
??
if?(cmd_opts.long_option
????(ACE_TEXT?(
"config"),?'f',?ACE_Get_Opt::ARG_REQUIRED)?==?-1)
????
return?-1;
??
int?option;
??ACE_TCHAR?config_file[MAXPATHLEN];
??ACE_OS::strcpy?(config_file,?ACE_TEXT?(
"HAStatus.conf"));
??
while?((option?=?cmd_opts?())?!=?EOF)
????
switch?(option)
??
{
????
case?'f':
??????ACE_OS::strncpy?(config_file,
????????cmd_opts.opt_arg?(),
????????MAXPATHLEN);
??????
break;
????
case?':':
??????ACE_ERROR_RETURN
????????((LM_ERROR,?ACE_TEXT?(
"-%c?requires?an?argument\n"),
????????cmd_opts.opt_opt?()),
????????
-1);
????
default:
??????ACE_ERROR_RETURN
????????((LM_ERROR,?ACE_TEXT?(
"Parse?error.\n")),?-1);
??}


??ACE_Configuration_Heap?config;
??config.open?();
??ACE_Registry_ImpExp?config_importer?(config);
??
if?(config_importer.import_config?(config_file)?==?-1)
????ACE_ERROR_RETURN?((LM_ERROR,
????ACE_TEXT?(
"%p\n"),
????config_file),
????
-1);

??ACE_Configuration_Section_Key?status_section;
??
if?(config.open_section?(config.root_section?(),
????ACE_TEXT?(
"HAStatus"),
????
0,
????status_section)?
==?-1)
????ACE_ERROR_RETURN?((LM_ERROR,
????ACE_TEXT?(
"%p\n"),
????ACE_TEXT?(
"Can't?open?HAStatus?section")),
????
-1);

??u_int?status_port;
??
if?(config.get_integer_value?(status_section,
????ACE_TEXT?(
"ListenPort"),
????status_port)?
==?-1)
????ACE_ERROR_RETURN?((LM_ERROR,
????ACE_TEXT?(
"HAStatus?ListenPort?does?")
????ACE_TEXT?(
"not?exist\n")),
????
-1);
??
this->listen_addr_.set?(static_cast<u_short>?(status_port));

??
if?(this->acceptor_.open?(this->listen_addr_)?!=?0)
????ACE_ERROR_RETURN?((LM_ERROR,
????ACE_TEXT?(
"HAStatus?%p\n"),
????ACE_TEXT?(
"accept")),
????
-1);
??ACE_DEBUG((LM_DEBUG,ACE_TEXT(
"listen?port?=?%d\n"),
????listen_addr_.get_port_number()));
??
return?0;
}

//?Listing?1

//?Listing?2?code/ch19
int
HA_Status::fini?(
void)
{
??
this->acceptor_.close?();
??
return?0;
}

//?Listing?2

//?Listing?3?code/ch19
int
HA_Status::info?(ACE_TCHAR?
**str,?size_t?len)?const
{
??ACE_TCHAR?buf[BUFSIZ];
??ACE_OS::sprintf?(buf,?ACE_TEXT?(
"HAStatus?listening?on?port?%hu\n"),
????
this->listen_addr_.get_port_number?());
??
if?(*str?==?0)
????
*str?=?ace::strnew?(buf);
??
else
????ACE_OS::strncpy?(
*str,?buf,?len);
??
return?static_cast<int>?(ACE_OS::strlen?(*str));
}

//?Listing?3

//?Listing?4?code/ch19
ACE_FACTORY_DEFINE?(ACE_Local_Service,?HA_Status)

ACE_STATIC_SVC_DEFINE?(HA_Status_Descriptor,
???????????????????????ACE_TEXT?(
"HA_Status_Static_Service"),
???????????????????????ACE_SVC_OBJ_T,
???????????????????????
&ACE_SVC_NAME?(HA_Status),
???????????????????????ACE_Service_Type::DELETE_THIS?
|
???????????????????????ACE_Service_Type::DELETE_OBJ,
???????????????????????
0)??//?Service?not?initially?active
ACE_STATIC_SVC_REQUIRE?(HA_Status_Descriptor)

ClientHandler.h

//@file:?ClientHandler.h
//???????事件類
//@author:?AGP
#ifndef?CLIENT_HANDLER_H
#define?CLIENT_HANDLER_H
?
#include?
"ace/SOCK_Stream.h"
#include?
"ace/SOCK_Acceptor.h"
#include?
"ace/Service_Object.h"
#include?
"ace/Svc_Handler.h"

class?ClientHandler?:
??
public?ACE_Svc_Handler<ACE_SOCK_STREAM,?ACE_NULL_SYNCH>
{
???typedef?ACE_Svc_Handler
<ACE_SOCK_STREAM,?ACE_NULL_SYNCH>?BASE_T;
public:
??
int?open(void*?=?0);
??
virtual?int?handle_input(ACE_HANDLE?fd?=?ACE_INVALID_HANDLE);
??
virtual?int?handle_output(ACE_HANDLE?fd?=?ACE_INVALID_HANDLE);
}
;
#endif


ClientHandler.cpp

//@file:?ClientHandler.cpp
//???????ClientHandler類的實現
#include?"ClientHandler.h"
#include?
"ace/os.h"
#include?
"ace/Time_Value.h"
#include?
"ace/Message_Block.h"
int?ClientHandler::open(void*?p)
{
??ACE_DEBUG((LM_DEBUG,ACE_TEXT(
"open\n")));
??
if?(BASE_T::open?(p)?==?-1)
????
return?-1;

??ACE_TCHAR?peer_name[MAXHOSTNAMELEN];
??ACE_INET_Addr?peer_addr;
??
if?(this->peer?().get_remote_addr?(peer_addr)?==?0?&&
????peer_addr.addr_to_string?(peer_name,?MAXHOSTNAMELEN)?
==?0)
????ACE_DEBUG?((LM_DEBUG,
????ACE_TEXT?(
"(%P|%t)?Connection?from?%s\n"),
????peer_name));

??
return?0;
}


int?ClientHandler::handle_input(ACE_HANDLE?fd?/*?=?ACE_INVALID_HANDLE?*/)
{
??ACE_DEBUG((LM_DEBUG,ACE_TEXT(
"handle_input\n")));
??
const?size_t?INPUT_SIZE?=?4096;
??
char?buffer[INPUT_SIZE];
??ssize_t?recv_cnt,?send_cnt;

??recv_cnt?
=?this->peer?().recv?(buffer,?sizeof(buffer));
??
if?(recv_cnt?<=?0)
??
{
????ACE_DEBUG?((LM_DEBUG,
??????ACE_TEXT?(
"(%P|%t)?Connection?closed\n")));
????
return?-1;
??}

??buffer[recv_cnt]?
=?0;

??send_cnt?
=
????
this->peer?().send?(buffer,
????ACE_static_cast?(size_t,?recv_cnt));
???ACE_DEBUG((LM_DEBUG,ACE_TEXT(
"收到的消息是[%s]\n"),buffer));
??
if?(send_cnt?==?recv_cnt)
????
return?0;
??
if?(send_cnt?==?-1?&&?ACE_OS::last_error?()?!=?EWOULDBLOCK)
????ACE_ERROR_RETURN?((LM_ERROR,
????ACE_TEXT?(
"(%P|%t)?%p\n"),
????ACE_TEXT?(
"send")),
????
0);
??
if?(send_cnt?==?-1)
????send_cnt?
=?0;
??ACE_Message_Block?
*mb;
??size_t?remaining?
=
????ACE_static_cast?(size_t,?(recv_cnt?
-?send_cnt));
??ACE_NEW_RETURN
????(mb,?ACE_Message_Block?(
&buffer[send_cnt],?remaining),?-1);
??
int?output_off?=?this->msg_queue?()->is_empty?();
??ACE_Time_Value?nowait?(ACE_OS::gettimeofday?());
??
if?(this->putq?(mb,?&nowait)?==?-1)
??
{
????ACE_ERROR?((LM_ERROR,
??????ACE_TEXT?(
"(%P|%t)?%p;?discarding?data\n"),
??????ACE_TEXT?(
"enqueue?failed")));
????mb
->release?();
????
return?0;
??}

??
if?(output_off)
????
return?this->reactor?()->register_handler
????(
this,?ACE_Event_Handler::WRITE_MASK);
??
return?0;

}


int?ClientHandler::handle_output(ACE_HANDLE?fd?/*?=?ACE_INVALID_HANDLE?*/)
{
??ACE_Message_Block?
*mb;
??ACE_Time_Value?nowait?(ACE_OS::gettimeofday?());
??
while?(-1?!=?this->getq?(mb,?&nowait))
??
{
????ssize_t?send_cnt?
=
??????
this->peer?().send?(mb->rd_ptr?(),?mb->length?());
????
if?(send_cnt?==?-1)
??????ACE_ERROR?((LM_ERROR,
??????ACE_TEXT?(
"(%P|%t)?%p\n"),
??????ACE_TEXT?(
"send")));
????
else
??????mb
->rd_ptr?(ACE_static_cast?(size_t,?send_cnt));
????
if?(mb->length?()?>?0)
????
{
??????
this->ungetq?(mb);
??????
break;
????}

????mb
->release?();
??}

??
return?(this->msg_queue?()->is_empty?())???-1?:?0;

}


特別說明,下面是某網友的問題

我在用ACE中Service-Config框架配置靜態服務時,出現下列錯誤:

error?C2146:?syntax?error?:?missing?';'?before?identifier?'ace_svc_desc_Time_Service_Descriptor'

error?C2501:?'ACE_Static_Svc_Descriptor'?:?missing?storage-class?or?type?specifiers

出錯的地方為:
ACE_STATIC_SVC_DEFINE(Time_Service_Descriptor,?
ACE_TEXT("time"),?ACE_SVC_OBJ_T,?
&ACE_SVC_NAME(TimeService),?ACE_Service_Type::DELETE_THIS|ACE_Service_Type::DELETE_OBJ,?1)?

問題所在
需要在HA_Status.cpp中包含,這一點是AGP書上未指明的
#include "
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
              欧美午夜电影一区| 国产日韩欧美不卡在线| 狠狠色综合一区二区| 久久综合九色综合网站| 快射av在线播放一区| 亚洲免费av网站| 9色porny自拍视频一区二区| 欧美激情精品久久久久| 夜夜狂射影院欧美极品| 欧美视频中文字幕在线| 久久精品国产欧美亚洲人人爽| 欧美一级播放| 亚洲视频在线二区| 欧美一级久久| 亚洲午夜高清视频| 欧美黄色片免费观看| 国产精品久久久久久久久久久久| 久久久精品日韩欧美| 欧美激情一二区| 欧美成熟视频| 激情综合色综合久久| 国产精品99久久久久久久女警 | 国产精品久久久一区麻豆最新章节| 香港成人在线视频| 欧美视频在线观看一区二区| 老巨人导航500精品| 国产毛片久久| 国产精品青草久久久久福利99| 久久久午夜电影| 精品福利电影| 欧美日韩国产在线| 亚洲欧美日韩精品在线| 欧美一区二区三区四区在线观看| 久久午夜精品一区二区| 一区二区国产精品| 精品99一区二区| 日韩午夜在线电影| 欧美高清成人| 久久影视精品| 久久精品99国产精品日本 | 玖玖玖免费嫩草在线影院一区| 在线观看欧美日韩| 国产乱人伦精品一区二区| 欧美日韩国产探花| 欧美精品久久99久久在免费线| 久久夜色精品国产亚洲aⅴ| 亚洲欧美另类国产| 亚洲一区二区三区在线看| 亚洲激情精品| 一本色道久久综合亚洲精品高清 | 亚洲天堂成人| 99国产精品私拍| 亚洲精品美女免费| 欧美一级欧美一级在线播放| 一本久道综合久久精品| 最新日韩精品| 久久精品国产免费看久久精品| 午夜在线播放视频欧美| 欧美一区中文字幕| 欧美sm视频| 亚洲色诱最新| 老司机精品久久| 国产精品二区在线观看| 国产一区二区你懂的| 亚洲欧洲精品一区二区三区| 亚洲图片激情小说| 亚洲国产精品久久久久婷婷884 | 欧美黑人国产人伦爽爽爽| 久久精品国产一区二区三| 欧美大片免费| 在线视频欧美日韩精品| 久久久久久一区| 欧美精品一区二区三区一线天视频| 久久偷看各类wc女厕嘘嘘偷窃| 欧美精品xxxxbbbb| 国产一区二区在线免费观看| 一区二区三区中文在线观看| 在线电影欧美日韩一区二区私密| 亚洲高清不卡一区| 国产精品亚洲人在线观看| 国产女主播一区二区| 国产一区二区三区在线观看视频 | 亚洲高清三级视频| 一区二区高清视频| 久久性天堂网| 狠狠综合久久av一区二区老牛| 欧美激情精品久久久久久久变态 | 欧美激情片在线观看| 日韩视频免费大全中文字幕| 亚洲男同1069视频| 欧美日本韩国在线| 在线观看亚洲视频| 欧美一区二区三区另类| 亚洲福利视频一区二区| 午夜综合激情| 国产日韩精品久久| 性欧美暴力猛交另类hd| 日韩亚洲欧美一区二区三区| 午夜欧美不卡精品aaaaa| 欧美日韩精品一区二区三区| 国产欧美日韩综合一区在线观看| 欧美色图天堂网| 一区二区三区四区五区精品视频 | 国产午夜一区二区三区| 欧美亚洲网站| 久久免费国产精品1| 亚洲一区在线播放| 免费亚洲婷婷| 欧美h视频在线| 欧美天堂亚洲电影院在线播放| 免费看成人av| 国产日韩一区二区三区在线播放| 欧美电影在线观看完整版| 欧美日本不卡视频| 久久国产精品亚洲va麻豆| 久久久久久久国产| 亚洲小说欧美另类社区| 欧美一区观看| 亚洲乱码国产乱码精品精可以看| 亚洲全黄一级网站| 亚洲国产精彩中文乱码av在线播放| 亚洲国产精品激情在线观看| 国产一区美女| 亚洲欧美日韩精品久久久| 亚洲神马久久| 欧美日韩国产专区| 亚洲精品一区二区在线| 国产精品久久久久久久午夜片| 久久这里只有精品视频首页| 欧美激情在线免费观看| 媚黑女一区二区| 国产午夜一区二区三区| 欧美有码在线视频| 亚洲美女视频| 这里是久久伊人| 亚洲第一精品夜夜躁人人爽| 久久一区二区三区av| 亚洲国产日韩欧美| 免费在线成人av| 亚洲欧美日韩电影| 国产亚洲精品aa| 欧美另类videos死尸| 亚洲视屏在线播放| 久久嫩草精品久久久精品| 亚洲国产毛片完整版| 欧美少妇一区| 免费日韩视频| 亚洲欧美激情一区二区| 亚洲国产精品久久久久秋霞蜜臀| 亚洲一区二区不卡免费| 樱花yy私人影院亚洲| 欧美日韩一区二区免费视频| 先锋a资源在线看亚洲| 国产精品久久久久久久一区探花| 欧美a一区二区| 欧美午夜无遮挡| 亚洲激情国产| 亚洲成人自拍视频| 国内自拍亚洲| 午夜欧美视频| 久久aⅴ国产欧美74aaa| 欧美激情一区在线观看| 蜜桃av一区二区| 国产日韩精品在线观看| 一区二区三区高清不卡| 亚洲国产综合视频在线观看| 性欧美8khd高清极品| 亚洲天堂免费在线观看视频| 欧美黄色免费| 亚洲美女91| 亚洲午夜久久久久久久久电影网| 麻豆精品视频在线观看| 久久免费黄色| 免费成人av资源网| 久久久久久久网站| 国模私拍视频一区| 欧美成人a视频| 日韩视频在线一区| 午夜精品久久久久久| 国产精品日韩久久久久| 亚洲欧美另类国产| 免费成人激情视频| 又紧又大又爽精品一区二区| 黄色国产精品| 在线观看一区视频| 国产视频在线观看一区| 悠悠资源网亚洲青| 亚洲视频欧美视频| 99国产精品国产精品久久| 欧美日韩www| 欧美视频日韩视频在线观看| 欧美黑人在线观看| 国产老肥熟一区二区三区| 国内外成人在线| 在线观看成人av| 欧美亚州一区二区三区| 在线欧美三区| 亚洲一区二区精品视频| 午夜亚洲福利在线老司机| 久久夜色撩人精品|