myrecv function gSoap

myrecv function gSoap

本文关键字:gSoap function myrecv      更新时间:2023-10-16

我正在尝试编写一台GSOAP服务器,该服务器需要保存传入的消息。我想将其保存在缓冲区中。这是GSOAP文档在客户端进行保存消息的方式...

//from gSoap Documentation 
//SOURCE: https://www.genivia.com/doc/soapdoc2.html#tth_sEc19.7
int mysend(struct soap *soap, const char *s, size_t n)
{
   struct buffer *h = (struct buffer*)soap->user; // get buffer through handle
   int m = h->max, k = h->len + n;
   // need to increase space?
   if (m == 0)
      m = 1024;
   else 
      while (k >= m)
         m *= 2;
   if (m != h->max)
   {
      char *buf = malloc(m);
      memcpy(buf, h->buf, h->len);
      h->max = m;
      if(h->buf)
         free(h->buf);
      h->buf = buf;
   }
   memcpy(h->buf + h->len, s, n);
   h->len += n;
   return SOAP_OK;
} 

这可以进行一些修改,但是如果我将同样的想法带到服务器端,将其存储到缓冲区并使用此返回语句结束...

size_t myrecv(struct soap *soap, char *s, size_t n){
//do similar to above example...
...
return default_frecv(soap,s,n);
}

它仅存储从服务器回到客户端的消息。我需要将消息从客户端保存到服务器。我认为RECV会给我传入的信息,但事实并非如此。有任何想法吗?任何帮助,建议或想法都将受到赞赏!预先感谢!

MySend示例的来源:https://www.genivia.com/doc/soapdoc2.html#tth_sec19.7

我需要将消息从客户端保存到服务器。我 思想recv会给我传入的信息,但这不是 案例。

嗯。文档清楚地说,frecv()是接收所有消息的回调,无论是客户端实现还是服务器端实现。因此,定义您自己的frecv()回调应该这样。如果卡住了,请查看" gsoap/plugin/logging.c消息记录器",该消息实现此回调以捕获接收到的消息并将其发送到文件/管道。

我能够钩到freecv()中,并在调用默认的FRECV()函数后进行自己的其他处理。但是,一个新的目的要求我在默认的FRECV()之前解析缓冲区,此时尚不存在。一旦调用了默认的FRECV(),就存在缓冲区,但是我想拦截的缓冲区上采取的动作(即Soap_serve())已经发生,因此我在派生的上下文中是一个请求。/p>

我的目的是解析WSDL名称的缓冲区,以将唯一的名称空间分配给SOAP_SERVE(),但它不起作用。