我们正在尝试在 gsoap 结构中包含自定义的 header 。 以下是我们的 header 定义:
typedef struct apollo__Header
{
char *UserName;
int VenueId;
time_t TransactionTime;
};
struct SOAP_ENV__Header
{
struct apollo__Header *apollo__Header 0; /* mustUnderstand */
};
我们使用soocpp2编译器使用以下命令生成了envStub和其他 header /代码:
$(SOAPCPP2) -z1 -d env -p env $(GSOAP_HEADERS) env_soap.h
$(SOAPCPP2) -z1 -n -t -d gsoap $(GSOAP_HEADERS) apollo_soap.h
在客户端代码中,我们已初始化此 header ,如下所示:
void
prepareSoapHeader(soap* soap, const rString username)
{
//pProperties props = AppProps::getProperties();
apollo__Header *header = (apollo__Header*)malloc(sizeof(apollo__Header));
header->UserName = new char[username.length() + 1];
strcpy(header->UserName, username.toCString());
header->VenueId = 110;
header->TransactionTime = 0;
soap->header = (SOAP_ENV__Header*)malloc(sizeof(SOAP_ENV__Header));
soap->header->apollo__Header = header;
}
现在,当我们调用服务器上的 Web 服务时,我们在访问此 header 时会在服务器上遇到段错误! 执行以下代码时服务器崩溃:
int apollo__getAvailableTestIDs(soap* soap, apollo__vAvailableTestIDs &resp)
{
apollo__Header *header = getSoapHeader(soap);
if(header != NULL){
AccessLogger l(soap->peer,"getAvailableTestIDs", "", header->UserName);
}
else{
AccessLogger l(soap->peer,"getAvailableTestIDs", "", "UNKNOWN_USER");
}
调试显示:
(gdb) p *soap->header->apollo__Header->UserName
Cannot access memory at address 0xc0de000001da1230
(gdb) p *soap->header->apollo__Header
Cannot access memory at address 0xc0de000001da1230
我们尝试找出根本原因,发现通过在客户端代码中打印 Header 的值,可以正确初始化 Header。 然而 tcpdump 显示客户端没有向服务器发送 header 值,就像 。
这似乎是一些配置错误。任何人都可以帮助指出这里出了什么问题吗? 任何帮助将不胜感激。
谢谢。
最佳答案
如果有多个.c文件,并且是重新编译,请确保您拥有所有具有最新结构更改的目标文件。
关于c++ - 访问自定义 gsoap header 时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22839191/