如何(优雅地)终止 gSOAP 服务器

How do I (gracefully) terminate a gSOAP server?

本文关键字:终止 gSOAP 服务器 如何      更新时间:2023-10-16

我有从WSDL文件+Qt GUI生成的gSOAP服务器。生成的代码工作得很好,除了一个点导致我的进程在 GUI 退出后保持活动状态。(我正在Windows上部署,所以我没有信号(

我需要我的 GUI 保持活动状态(自然(,所以我将服务器代理对象移动到一个基于 QObject 的类,后者被移动到另一个QThread,然后我通过外部信号启动它。服务器现在在其父 QObject 的事件循环上运行并且工作正常。

唯一的问题是我不知道如何在退出时终止服务器。我尝试调整为服务器生成的代码(顺便说一下,这真的是一个好主意吗?

int MySweetService::run(int port)
{   if (!soap_valid_socket(this->soap->master) && !soap_valid_socket(this->bind(NULL, port, 100)))
        return this->soap->error;
    for (;;) // =====> Maybe here I can put my while(module_is_running_atomic_bool) ?
    {   if (!soap_valid_socket(this->accept()))
        {   if (this->soap->errnum == 0) // timeout?
                this->soap->error = SOAP_OK;
            break;
        }
        if (this->serve())
            break;
        this->destroy();
    }
    return this->soap->error;
} 

从另一个线程调用 soap_done(&soap( 会终止对 accept(( 和下一个 "serving" 线程的阻塞调用。它在Windows上对我有用,但我在Linux上不起作用 - 看起来gsoap有一些多任务处理问题。您还需要一些布尔标志来让"服务"线程知道您关闭了它,而不仅仅是 gsope 中的错误。