iam试图构建一个多读取的web服务。单线程正在工作,在我的主要功能中,我使用以下命令:

int main(int argc, char **argv) {
    CardSoapBindingService CardSrvc;
    Config Conf ;
    Conf.update();

    int port = Conf.listener_port;
    if (!port)
        CardSrvc.serve();
    else {
        if (CardSrvc.run(port)) {
            CardSrvc.soap_stream_fault(std::cerr);
            exit(-1);
        }
    }
    return 0;
}

但是我想要多线程,所以我查看了文档,找到了它们的example,我改用了我的代码。编译时出现此错误:
main.cpp:在函数int main(int, char**)':main.cpp:56: error: soap_serve中未声明(首先使用此函数)
main.cpp:56:错误:(每个未声明的标识符仅报告一次
出现在其中的功能。)
main.cpp:在函数void* process_request(void*)':<br>main.cpp:101: error: soap_serve中未声明(首先使用此函数)
制造:*** [main.o] Fehler 1

我该如何工作?

最佳答案

重要提示:

此代码至少需要gsoap版本2.8.5。它最初是在带有gsoap版本2.8.3的Solaris 8上构建的,将代码移植到Ubuntu并在valgrind下运行表明该2.8.3 gsoap++库正在破坏内存,从而导致了SIGSEGV。应该注意的是,截至2011年11月25日,Ubuntu使用apt-get安装的gsoap的版本是损坏的2.8.3。需要手动下载并构建最新版本的gsoap(在配置gsoap构建之前,请确保安装flex和bison!)。

使用gsoap 2.8.5,以下代码可以愉快地创建线程并将SOAP消息提供给多个客户端,现在valgrind报告内存分配为0错误。

查看您的代码,您正在使用-i(或-j)选项构建的示例可以创建C++对象。 gsoap尺寸的线程示例是用标准C编写的;因此,对诸如soap_serve()之类的函数的引用就没有了。

下面是我快速重写的多线程示例,以使用生成的C +对象。它基于以下定义文件:

// Content of file "calc.h":
//gsoap ns service name: Calculator
//gsoap ns service style: rpc
//gsoap ns service encoding: encoded
//gsoap ns service location: http://www.cs.fsu.edu/~engelen/calc.cgi
//gsoap ns schema namespace: urn:calc
//gsoap ns service method-action: add ""
int ns__add(double a, double b, double &result);
int ns__sub(double a, double b, double &result);
int ns__mul(double a, double b, double &result);
int ns__div(double a, double b, double &result);

主服务器代码如下所示:
#include "soapCalculatorService.h"  // get server object
#include "Calculator.nsmap"     // get namespace bindings

#include <pthread.h>

void *process_request(void *calc) ;

int main(int argc, char* argv[])
{
    CalculatorService c;
    int port = atoi(argv[1]) ;
    printf("Starting to listen on port %d\n", port) ;
    if (soap_valid_socket(c.bind(NULL, port, 100)))
    {
        CalculatorService *tc ;
        pthread_t tid;
        for (;;)
        {
            if (!soap_valid_socket(c.accept()))
                return c.error;
            tc = c.copy() ; // make a safe copy
            if (tc == NULL)
                break;
            pthread_create(&tid, NULL, (void*(*)(void*))process_request, (void*)tc);

            printf("Created a new thread %ld\n", tid) ;
        }
    }
    else {
        return c.error;
    }

}


void *process_request(void *calc)
{
   pthread_detach(pthread_self());
   CalculatorService *c = static_cast<CalculatorService*>(calc) ;
   c->serve() ;
   c->destroy() ;
   delete c ;
   return NULL;
}

这是一个非常基本的线程模型,但是它展示了如何使用gsoap生成的C++类来构建多线程服务器。

关于c++ - gSOAP多线程,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8150380/

10-12 20:40