gSoap:如何优雅地关闭webservice应用程序?

时间:2011-03-08 21:52:04

标签: c++ web-services soap gsoap

我正在使用gSoap编写Web服务。它作为控制台应用程序运行。在我看到的所有gSoap示例中,即使在多线程版本中,也会以无限循环方式调度请求,如(;;;)。

但是,当用户按下控制台上的空间时,如何让我的web服务优雅地终止?

最好:

  1. 停止接受新连接;
  2. 为现有的服务;
  3. 退出申请

3 个答案:

答案 0 :(得分:3)

到目前为止,我提出的唯一解决方案是使用超时     soap-> recv_timeout = 20;     soap-> send_timeout = 20;     soap-> connect_timeout = 5;     soap-> accept_timeout = 5; 然后所有阻塞函数定期返回。但这对我来说并不理想,因为即使有正在进行的传输,我希望能够快速终止应用程序,但与此同时,不要在缓慢/片状连接上妥协可靠性(它& #39;是通过GPRS连接的嵌入式设备。

答案 1 :(得分:2)

文档中的7.2.4 How to Create a Multi-Threaded Stand-Alone Service部分包含用于编写接受循环的示例代码。您需要编写自己的接受循环并添加信号处理,以便它响应Ctrl-C。

  1. 停止接受新连接:

    离开循环,以便停止呼叫接受。

  2. 服务现有的:

    线程需要在完成时通知您,因此您可以在活动客户端数为零时退出。 (boost :: thead_group有一个join_all就是这样。)

  3. 退出申请表:

答案 2 :(得分:0)

您需要做的是注册信号处理程序,以便在使用Ctrl + C终止应用程序时,它会调用您已注册的函数,您可以正常终止它。

e.g

class gsoap_test {

public:
   void start() {
     running_ = true;
     while(running_) {
       //gsoap threads
     }
     //stop and cleanup
   }


   void stop() {
        running_ = false;
   }
 private:
      bool running_;
};

 //global variable 
 gsoap_test gsoap;


void sighandler(int sig)
{
    std::cout<< "Signal caught..." << std::endl;

    //Stop gracefully here
    gsoap.stop();
    exit(0);

}

int main(int argc, char** argv) {

  //register signal
   signal(SIGABRT, &sighandler);
   signal(SIGTERM, &sighandler);
   signal(SIGINT, &sighandler);

   gsoap.start();

   return EXIT_SUCCESS;
}