我正在尝试编写一个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
发布于 2017-12-07 10:26:55
我需要保存从客户端发送到服务器的消息。我以为recv会给我传入的消息,但事实并非如此。
嗯。文档中明确指出,无论是客户端实现还是服务器端实现,frecv()都是接收所有消息的回调函数。因此,定义自己的frecv()回调应该可以做到这一点。如果遇到问题,可以看看gsoap/plugin/logging.c消息记录器,它实现了这个回调来捕获接收到的消息并将其发送到文件/管道。
发布于 2021-06-04 10:26:31
在调用默认的frecv()函数之后,我能够连接到frecv()并执行我自己的额外处理。然而,一个新的目的要求我在缺省的frecv()之前解析缓冲区,而在这一点上它还不存在。一旦调用了默认的frecv(),缓冲区就存在了,但是在缓冲区上执行的操作(即soap_serve())已经发生了,这是我想要截取的,所以我在派生上下文中落后了一个请求。
我的目的是解析缓冲区中的WSDL名称,以便为soap_serve()分配一个惟一的名称空间,但这并不起作用。
https://stackoverflow.com/questions/47642470
复制相似问题