找回密码
 用户注册

QQ登录

只需一步,快速开始

楼主: bao19830224

NT Service问题

[复制链接]
发表于 2009-11-9 13:55:22 | 显示全部楼层
说明你的程序没有正确监听。
启动后会自动调用:
int
Service::svc (void)
你需要追踪一下代码,检查一下程序是否能自动启动,正确监听端口。
服务程序,并无非常特别的地方,就是要实现服务定义的接口,服务控制系统,能调用即可。
 楼主| 发表于 2009-11-13 11:21:53 | 显示全部楼层
谢谢 winston

但仍不能监听端口。我很迷茫的就是 -d -s 都能正常监听,就是重启电脑以后就不能正常监听了,不知道是什么原因

我的svc()函数
int
Service::svc ()
{
if (report_status (SERVICE_RUNNING) == 0)
    reactor ()->owner (ACE_Thread::self ());

ACE_STATIC_SVC_REGISTER(HA_Status_Descriptor);

ACE_Service_Config::open(ACE_TEXT("HA_Status_Static_Service"),ACE_DEFAULT_LOGGER_KEY,0);

reactor ()->run_reactor_event_loop();

  return 0;
}
 楼主| 发表于 2009-11-13 11:25:51 | 显示全部楼层
winston版主 能抽空帮我看看我的代码吗?我就是找着ACE那个例子改的 很简单的 谢谢

我的环境是vs2008+ACE 5.7
 楼主| 发表于 2009-11-13 11:28:34 | 显示全部楼层
忘记插入代码了 [local]3[/local]
 楼主| 发表于 2009-11-13 11:34:38 | 显示全部楼层
没有上传成功啊,应该怎么上传附件呢?[local]1[/local]
发表于 2009-11-13 14:53:42 | 显示全部楼层
帖上核心的代码就成了。让我们看看吧。
 楼主| 发表于 2009-11-13 14:54:03 | 显示全部楼层
我用MessageBeep (MB_OK);跟踪 发现机器重启以后程序没有执行int Service::svc (void)中的代码,不知道是什么原因?请大家指点
发表于 2009-11-13 22:43:07 | 显示全部楼层
贴上代码。
我用这个例子程序做了好几个工程,毫无问题。
 楼主| 发表于 2009-11-16 08:57:31 | 显示全部楼层
好的。大体的框架就是ACE自带的例子,我只是改动了SVC()和start_svc()两个函数,另外自己写了一个静态配置(ClientService类),来监听端口

int
Service::svc ()
{
  if (report_status (SERVICE_RUNNING) == 0)
      reactor ()->owner (ACE_Thread::self ());
  ACE_STATIC_SVC_REGISTER(HA_Status_Descriptor);
  ACE_Service_Config::open(ACE_TEXT("HA_Status_Static_Service"),ACE_DEFAULT_LOGGER_KEY,0);
  reactor ()->run_reactor_event_loop();
  return 0;
}

int Service::start_svc(ACE_Time_Value *wait_time,
                 DWORD *svc_state ,
                 int argc, ACE_TCHAR *argv[])
{
  ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("start_svc\n")));
  int ret=inherited::start_svc(0,0,/*argc,argv*/0,0);
  ACE_STATIC_SVC_REGISTER(HA_Status_Descriptor);
  ACE_Service_Config::open(ACE_TEXT("HA_Status_Static_Service"),ACE_DEFAULT_LOGGER_KEY,0);
  ACE_Reactor::instance()->run_reactor_event_loop();
  return ret;
}
 楼主| 发表于 2009-11-16 09:06:54 | 显示全部楼层
在发静态配置类(ClientService类)
int ClientService::open(void *p)
{
  if(super::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))
     ACE_DEBUG((LM_DEBUG,ACE_TEXT("(%P|%t) Connection from %s\n"),peer_name));
  return 0;
}

int ClientService::handle_input(ACE_HANDLE fd)
{
   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;
  }

   send_cnt = this->peer().send(buffer,ACE_static_cast(size_t,recv_cnt));
   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 ClientService::handle_output(ACE_HANDLE fd)
{
   ACE_Message_Block *mb;
   ACE_Time_Value nowait(ACE_OS::gettimeofday());
   while(this->getq(mb,&nowait) != -1)
  {
     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;
}

int ClientService::handle_close(ACE_HANDLE fd,ACE_Reactor_Mask close_mask)
{
   if(close_mask == ACE_Event_Handler::WRITE_MASK)
      return 0;
   return super::handle_close(fd,close_mask);
}

int HA_Status::init(int argc, ACE_TCHAR *argv[])
{
   char config_file[MAXPATHLEN];
   memset(config_file,'\0',MAXPATHLEN);
   ACE_OS::strcpy(config_file,ACE_TEXT("HAStatus.conf"));
   ACE_Configuration_Heap config;
   if (config.open () == -1)
      ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT ("%p\n"), ACE_TEXT ("config")), -1);
      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;
     //指定打开HAStatus 节进行读取
      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 not exist\n")),
                -1);
      this->listen_addr_.set (ACE_static_cast(u_short,status_port));
      if(this->ClientAcceptor.open(this->listen_addr_) != 0)
         ACE_ERROR_RETURN((LM_ERROR,ACE_TEXT ("Acceptor error.\n")),-1);
      return 0;
}

int HA_Status::fini(void)
{
   this->ClientAcceptor.close();
   return 0;
}

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_OBJ|ACE_Service_Type::DELETE_THIS,0)
ACE_STATIC_SVC_REQUIRE(HA_Status_Descriptor)
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-12-23 13:57 , Processed in 0.021817 second(s), 4 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表