winston 发表于 2009-11-9 13:55:22

说明你的程序没有正确监听。
启动后会自动调用:
int
Service::svc (void)
你需要追踪一下代码,检查一下程序是否能自动启动,正确监听端口。
服务程序,并无非常特别的地方,就是要实现服务定义的接口,服务控制系统,能调用即可。

bao19830224 发表于 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;
}

bao19830224 发表于 2009-11-13 11:25:51

winston版主 能抽空帮我看看我的代码吗?我就是找着ACE那个例子改的 很简单的 谢谢

我的环境是vs2008+ACE 5.7

bao19830224 发表于 2009-11-13 11:28:34

忘记插入代码了 3

bao19830224 发表于 2009-11-13 11:34:38

没有上传成功啊,应该怎么上传附件呢?1

winston 发表于 2009-11-13 14:53:42

帖上核心的代码就成了。让我们看看吧。

bao19830224 发表于 2009-11-13 14:54:03

我用MessageBeep (MB_OK);跟踪 发现机器重启以后程序没有执行int Service::svc (void)中的代码,不知道是什么原因?请大家指点

winston 发表于 2009-11-13 22:43:07

贴上代码。
我用这个例子程序做了好几个工程,毫无问题。

bao19830224 发表于 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;
}

bao19830224 发表于 2009-11-16 09:06:54

在发静态配置类(ClientService类)
int ClientService::open(void *p)
{
if(super::open(p) == -1)
    return -1;
ACE_TCHAR peer_name;
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;
   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,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;
   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)
页: 1 [2] 3 4
查看完整版本: NT Service问题