我试图建立一个多线程的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:错误:soap_serve’未声明(首先使用此功能)
main.cpp:56:错误:(每个未声明的标识符仅报告一次
功能它出现在.)
main.cpp:在函数void * process_request(void *)’:< br>
main.cpp:101:错误:soap_serve’未声明(首先使用此功能)
make:*** [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 doumention中的线程示例是用标准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类来构建多线程服务器.