我正在使用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