我正在使用gSoap編寫web服務。它作爲控制檯應用程序運行。在我看到的所有gSoap示例中,即使在多線程版本中,該請求也會像(;;;)一樣在無限循環中分派。gSoap:如何正常關閉webservice應用程序?
但是,如何讓我的web服務在用戶按下控制檯上的空間時正常終止?
優選:
- 停止接受新的連接;
- 現有服務;從應用
我正在使用gSoap編寫web服務。它作爲控制檯應用程序運行。在我看到的所有gSoap示例中,即使在多線程版本中,該請求也會像(;;;)一樣在無限循環中分派。gSoap:如何正常關閉webservice應用程序?
但是,如何讓我的web服務在用戶按下控制檯上的空間時正常終止?
優選:
文檔中的部分7.2.4 How to Create a Multi-Threaded Stand-Alone Service
停止接受新的連接:
退出循環,所以你停止調用接受。
即成現有:
的線程需要告知你他們時完成,所以你可以退出的時候有效客戶的數量是零。 (升壓:: thead_group有join_all這正是這麼做的。)從應用
退出:
不幸的是Eddy的解決方案對我無效。 soap_accept似乎不會在信號上退出。在調用soap_accept之前,我在soap.master上添加了select。當收到一個信號時,選擇將終止EINTR,然後我可以拿起並使用它退出過程。如果select返回成功,那麼我就像之前一樣調用soap_accept。 HTH。 – user2461592 2013-06-20 16:34:51
你需要做的是註冊的信號處理程序,所以當你使用終止按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;
}
那麼,問題是如何正常地終止gSOAP線程,而不僅僅是如何通過CTRL-C或其他什麼來終止應用程序。我現在終止檢查kbhit。 – 2011-03-26 17:36:35
您可以停止該函數中的線程。我爲我的muktithreading sip服務器使用相同的功能,我們需要優雅地停止呼叫。 – rjoshi 2011-03-26 17:43:58
請參閱上面使用gsoap_test類的編輯。 gsoap_test的對象可以作爲一個函數參數傳遞給sighandler函數,如果你不想使它成爲全局的話。其他選項是使用boost :: signal函數。 – rjoshi 2011-03-26 18:06:19
我想出了迄今使用超時的唯一解決方案 soap-> recv_timeout = 20; soap-> send_timeout = 20; soap-> connect_timeout = 5; soap-> accept_timeout = 5; 然後所有的阻塞函數都會定期返回。但這對我來說並不理想,因爲即使有持續的傳輸,我也希望能夠快速終止應用程序,但同時又不想在慢速/片狀連接上損害可靠性(這是一種嵌入式設備通過GPRS連接)。
你在尋找邏輯還是源代碼? – fazo 2011-03-25 20:55:32
任何能夠幫助我理解如何去做的事情。代碼是首選,但我並不愚蠢,我認爲在這個主題上我只會用一兩個字就可以解決問題;)現在我只是從kbhit()= true的循環中分離出來,然後等待幾秒鐘請求完成。但這不可靠。如果某個線程需要更長時間才能完成? – 2011-03-25 20:59:44