我们正在尝试在gsoap结构中包含自定义标头。 以下是我们的标题定义:
typedef struct apollo__Header
{
char *UserName;
int VenueId;
time_t TransactionTime;
};
struct SOAP_ENV__Header
{
struct apollo__Header *apollo__Header 0; /* mustUnderstand */
};
我们使用soapcpp2编译器使用以下命令生成了envStub和其他头文件/代码:
$(SOAPCPP2) -z1 -d env -p env $(GSOAP_HEADERS) env_soap.h
$(SOAPCPP2) -z1 -n -t -d gsoap $(GSOAP_HEADERS) apollo_soap.h
在客户端代码中,我们已初始化此标头,如下所示:
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服务时,我们在访问此标头时会在服务器上出现分段错误! 服务器在执行以下代码时崩溃:
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正在通过在客户端代码中打印它的值来正确初始化。 但是tcpdump显示客户端没有向服务器发送标头值,就像它一样。
这似乎是一些配置错误。可以帮助指出这里出了什么问题。 任何帮助将不胜感激。
感谢。
答案 0 :(得分:0)
如果有多个.c文件,并且是重新编译,请确保您拥有所有具有最新结构更改的目标文件。