2011-03-08 49 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連接)。