Мы пытаемся включить настраиваемый заголовок в структуру gsoap. Ниже приведено определение заголовка:
typedef struct apollo__Header
{
char *UserName;
int VenueId;
time_t TransactionTime;
};
struct SOAP_ENV__Header
{
struct apollo__Header *apollo__Header 0; /* mustUnderstand */
};
Мы создали envStub и другие заголовки/код с помощью компилятора soapcpp2 с помощью следующей команды:
$(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;
}
Теперь, когда мы вызываем веб-службы на сервере, мы получаем ошибку сегментации на сервере при доступе к этому заголовку! Сбой сервера здесь, когда ниже код запускается:
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 показывает, что клиент не отправляет значения заголовка на сервер, как это.
Похоже, это некоторая ошибка конфигурации. Может ли любая помощь в том, чтобы указывать на то, что здесь происходит неправильно. Любая помощь будет оценена по достоинству.
Благодарю.
Если есть несколько файлов.c, и если это повторная компиляция, убедитесь, что у вас есть все объектные файлы с последними изменениями структуры.
malloc
иnew
? Я предлагаю вам выбрать один язык и придерживаться его, бородавки и все.