2011-03-08 19 views
1

我正在使用gSoap编写web服务。它作为控制台应用程序运行。在我看到的所有gSoap示例中,即使在多线程版本中,该请求也会像(;;;)一样在无限循环中分派。gSoap:如何正常关闭webservice应用程序?

但是,如何让我的web服务在用户按下控制台上的空间时正常终止?

优选:

  1. 停止接受新的连接;
  2. 现有服务;从应用
+0

你在寻找逻辑还是源代码? – fazo 2011-03-25 20:55:32

+0

任何能够帮助我理解如何去做的事情。代码是首选,但我并不愚蠢,我认为在这个主题上我只会用一两个字就可以解决问题;)现在我只是从kbhit()= true的循环中分离出来,然后等待几秒钟请求完成。但这不可靠。如果某个线程需要更长时间才能完成? – 2011-03-25 20:59:44

回答

2

文档中的部分7.2.4 How to Create a Multi-Threaded Stand-Alone Service

  • 出口具有用于写入接受循环示例代码。您需要编写自己的接受循环并添加信号处理,以响应Ctrl-C。

    1. 停止接受新的连接:

      退出循环,所以你停止调用接受。

    2. 即成现有:

      的线程需要告知你他们时完成,所以你可以退出的时候有效客户的数量是零。 (升压:: thead_group有join_all这正是这么做的。)从应用

    3. 退出:

  • +0

    不幸的是Eddy的解决方案对我无效。 soap_accept似乎不会在信号上退出。在调用soap_accept之前,我在soap.master上添加了select。当收到一个信号时,选择将终止EINTR,然后我可以拿起并使用它退出过程。如果select返回成功,那么我就像之前一样调用soap_accept。 HTH。 – user2461592 2013-06-20 16:34:51

    1

    你需要做的是注册的信号处理程序,所以当你使用终止按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; 
    } 
    
    +0

    那么,问题是如何正常地终止gSOAP线程,而不仅仅是如何通过CTRL-C或其他什么来终止应用程序。我现在终止检查kbhit。 – 2011-03-26 17:36:35

    +0

    您可以停止该函数中的线程。我为我的muktithreading sip服务器使用相同的功能,我们需要优雅地停止呼叫。 – rjoshi 2011-03-26 17:43:58

    +0

    请参阅上面使用gsoap_test类的编辑。 gsoap_test的对象可以作为一个函数参数传递给sighandler函数,如果你不想使它成为全局的话。其他选项是使用boost :: signal函数。 – rjoshi 2011-03-26 18:06:19

    2

    我想出了迄今使用超时的唯一解决方案 soap-> recv_timeout = 20; soap-> send_timeout = 20; soap-> connect_timeout = 5; soap-> accept_timeout = 5; 然后所有的阻塞函数都会定期返回。但这对我来说并不理想,因为即使有持续的传输,我也希望能够快速终止应用程序,但同时又不想在慢速/片状连接上损害可靠性(这是一种嵌入式设备通过GPRS连接)。