我正在使用gSoap编写Web服务。它作为控制台应用程序运行。在我看到的所有gSoap示例中,即使在多线程版本中,也会以无限循环方式调度请求,如(;;;)。
但是,当用户按下控制台上的空间时,如何让我的web服务优雅地终止?
最好:
答案 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。
停止接受新连接:
离开循环,以便停止呼叫接受。
服务现有的:
线程需要在完成时通知您,因此您可以在活动客户端数为零时退出。 (boost :: thead_group有一个join_all就是这样。)
退出申请表:
答案 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;
}