多线程 gSOAP 服务

发布于 2024-10-31 09:16:41 字数 590 浏览 1 评论 0原文

有没有办法让存根/骨架编译器生成线程服务(即通过为每个请求生成一个线程或通过线程池)或者我是否必须手动添加soap_copy(),pthread_create()...

我知道--根据常见问题解答和用户指南 7.2.4——gSOAP 是线程安全的并且支持多线程服务。但是,使用soapcpp2 -i 标志我最终得到

int DummyService::run(int port)
{   
    if (soap_valid_socket(bind(NULL, port, 100)))
    {   
        for (;;)
        {   
            if (!soap_valid_socket(accept()))
                 return this->error;
            (void)serve();
            soap_destroy(this);
            soap_end(this);
        }
    }
    else
        return this->error;

    return SOAP_OK;
}

任何提示?

Is there a way for the stub/skeleton compiler to generate threaded services (i.e. by spawning a thread for each request or by thread pooling) or do I have to manually add soap_copy(), pthread_create() ...

I know that -- according to the FAQ and user guide 7.2.4 -- gSOAP is thread safe and does support multi-threaded services. However, using the soapcpp2 -i flag I end up with

int DummyService::run(int port)
{   
    if (soap_valid_socket(bind(NULL, port, 100)))
    {   
        for (;;)
        {   
            if (!soap_valid_socket(accept()))
                 return this->error;
            (void)serve();
            soap_destroy(this);
            soap_end(this);
        }
    }
    else
        return this->error;

    return SOAP_OK;
}

Any hint?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

差↓一点笑了 2024-11-07 09:16:41

这可能不是对您的具体请求的直接处理,但它是我能找到的最接近的...(摘自 http://www.cs.fsu.edu/~engelen/soapdoc2.html#sec:mt )

下面的示例说明了使用线程来改进通过在单独的线程中处理新请求来提高服务质量:

#include "soapH.h"
#include < pthread.h >
#define BACKLOG (100) // Max. request backlog
int main(int argc, char **argv)
{
   struct soap soap;
   soap_init(&soap);
   if (argc < 2) // no args: assume this is a CGI application
   {
      soap_serve(&soap); // serve request, one thread, CGI style
      soap_destroy(&soap); // dealloc C++ data
      soap_end(&soap); // dealloc data and clean up
   }
   else 
   {
      soap.send_timeout = 60; // 60 seconds
      soap.recv_timeout = 60; // 60 seconds
      soap.accept_timeout = 3600; // server stops after 1 hour of inactivity
      soap.max_keep_alive = 100; // max keep-alive sequence
      void *process_request(void*);
      struct soap *tsoap;
      pthread_t tid;
      int port = atoi(argv[1]); // first command-line arg is port
      SOAP_SOCKET m, s;
      m = soap_bind(&soap, NULL, port, BACKLOG);
      if (!soap_valid_socket(m))
         exit(1);
      fprintf(stderr, "Socket connection successful %d\n", m);
      for (;;)
      {
         s = soap_accept(&soap);
         if (!soap_valid_socket(s))
         {
            if (soap.errnum)
            {
               soap_print_fault(&soap, stderr);
               exit(1);
            }
            fprintf(stderr, "server timed out\n");
            break;
         } 
         fprintf(stderr, "Thread %d accepts socket %d connection from IP %d.%d.%d.%d\n", i, s, (soap.ip >> 24)&0xFF, (soap.ip >> 16)&0xFF, (soap.ip >> 8)&0xFF, soap.ip&0xFF);
         tsoap = soap_copy(&soap); // make a safe copy
         if (!tsoap)
           break;
         pthread_create(&tid, NULL, (void*(*)(void*))process_request, (void*)tsoap);
      }
   }
   soap_done(&soap); // detach soap struct
   return 0;
}
void *process_request(void *soap)
{
   pthread_detach(pthread_self());
   soap_serve((struct soap*)soap);
   soap_destroy((struct soap*)soap); // dealloc C++ data
   soap_end((struct soap*)soap); // dealloc data and clean up
   soap_done((struct soap*)soap); // detach soap struct
   free(soap);
   return NULL;
}

注意:代码不会在程序终止时等待线程加入主线程。

在上面链接中引用的文档的同一区域中还有其他线程信息。它至少可以为您寻找解决方案提供一个起点。

This may not be a direct treatment of your specific request, but it is as close as I could find... (clipped from http://www.cs.fsu.edu/~engelen/soapdoc2.html#sec:mt )

The following example illustrates the use of threads to improve the quality of service by handling new requests in separate threads:

#include "soapH.h"
#include < pthread.h >
#define BACKLOG (100) // Max. request backlog
int main(int argc, char **argv)
{
   struct soap soap;
   soap_init(&soap);
   if (argc < 2) // no args: assume this is a CGI application
   {
      soap_serve(&soap); // serve request, one thread, CGI style
      soap_destroy(&soap); // dealloc C++ data
      soap_end(&soap); // dealloc data and clean up
   }
   else 
   {
      soap.send_timeout = 60; // 60 seconds
      soap.recv_timeout = 60; // 60 seconds
      soap.accept_timeout = 3600; // server stops after 1 hour of inactivity
      soap.max_keep_alive = 100; // max keep-alive sequence
      void *process_request(void*);
      struct soap *tsoap;
      pthread_t tid;
      int port = atoi(argv[1]); // first command-line arg is port
      SOAP_SOCKET m, s;
      m = soap_bind(&soap, NULL, port, BACKLOG);
      if (!soap_valid_socket(m))
         exit(1);
      fprintf(stderr, "Socket connection successful %d\n", m);
      for (;;)
      {
         s = soap_accept(&soap);
         if (!soap_valid_socket(s))
         {
            if (soap.errnum)
            {
               soap_print_fault(&soap, stderr);
               exit(1);
            }
            fprintf(stderr, "server timed out\n");
            break;
         } 
         fprintf(stderr, "Thread %d accepts socket %d connection from IP %d.%d.%d.%d\n", i, s, (soap.ip >> 24)&0xFF, (soap.ip >> 16)&0xFF, (soap.ip >> 8)&0xFF, soap.ip&0xFF);
         tsoap = soap_copy(&soap); // make a safe copy
         if (!tsoap)
           break;
         pthread_create(&tid, NULL, (void*(*)(void*))process_request, (void*)tsoap);
      }
   }
   soap_done(&soap); // detach soap struct
   return 0;
}
void *process_request(void *soap)
{
   pthread_detach(pthread_self());
   soap_serve((struct soap*)soap);
   soap_destroy((struct soap*)soap); // dealloc C++ data
   soap_end((struct soap*)soap); // dealloc data and clean up
   soap_done((struct soap*)soap); // detach soap struct
   free(soap);
   return NULL;
}

Note: the code does not wait for threads to join the main thread upon program termination.

There is additional threading information in the same area of the document referenced in the link above. It may at least provide a starting place in your search for a solution.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文