分段故障soap



我正在做一个简单的soap应用程序。我有两个功能,一个在服务器上,另一个在客户端上。然而,我一直在客户身上遇到细分错误。我做错了什么?

这是客户端

#include "soapTempConvertSoapProxy.h"
#include "soapTempConvertSoapService.h"
#include "TempConvertSoap.nsmap"
#include <iostream>
using namespace std;
#include <string>
#include <sstream>

std::string s = std::string();
const char server[] = "http://localhost:8000";
int main(int argc, char **argv)
    {
    TempConvertSoapProxy temp;
    //mudar endpoint se necessario
    temp.soap_endpoint = server;
    _ns1__FahrenheitToCelsius *ns1__FahrenheitToCelsius;
    _ns1__FahrenheitToCelsiusResponse *ns1__FahrenheitToCelsiusResponse;
    _ns1__CelsiusToFahrenheit *ns1__CelsiusToFahrenheit;
    _ns1__CelsiusToFahrenheitResponse *ns1__CelsiusToFahrenheitResponse;
    int ope = 1;
    while(ope)
    {
        std::cout << "Por favor entre com o codigo da operacao:" << 'n';
        std::cout << "1 = Fahrenheit para Celsius, 2 = Celsius para Fahrenheit, 0 = terminar" << 'n';

        std::cin >> ope;
        std::cout << "Por favor entre com a temperatura" << 'n';
        if(ope == 1 || ope == 3)
            {
                std::cin >> s;
                ns1__FahrenheitToCelsius->Fahrenheit = &s;
            }
        else
            {   
                    if(ope == 2 || ope == 4)
                        {   
                            std::cin >> s;
                            ns1__CelsiusToFahrenheit->Celsius = &s;
                        }
            }
        switch(ope)
            { 
                case 0: break;
                case 1: if(temp.FahrenheitToCelsius(ns1__FahrenheitToCelsius, ns1__FahrenheitToCelsiusResponse) == SOAP_OK)
                        {
                            std::string z = *(ns1__FahrenheitToCelsiusResponse->FahrenheitToCelsiusResult);
                            std::cout << z << 'n';
                        }
                    else
                        {
                            temp.soap_stream_fault(std::cerr);
                        }
                    break;
                case 2: if(temp.CelsiusToFahrenheit(ns1__CelsiusToFahrenheit, ns1__CelsiusToFahrenheitResponse) == SOAP_OK)
                        {
                            std::string z = ns1__FahrenheitToCelsiusResponse->FahrenheitToCelsiusResult->c_str();
                            std::cout << z << 'n';
                        }
                    else
                        {
                            temp.soap_stream_fault(std::cerr);
                        }
                    break;
                case 3: if(temp.FahrenheitToCelsius_(ns1__FahrenheitToCelsius, ns1__FahrenheitToCelsiusResponse) == SOAP_OK)
                        {
                            std::string z = ns1__FahrenheitToCelsiusResponse->FahrenheitToCelsiusResult->c_str();
                            std::cout << z << 'n';
                        }
                    else
                        {
                            temp.soap_stream_fault(std::cerr);
                        }
                    break;
                case 4:      if(temp.CelsiusToFahrenheit_(ns1__CelsiusToFahrenheit, ns1__CelsiusToFahrenheitResponse) == SOAP_OK)
                        {
                            std::string z = ns1__FahrenheitToCelsiusResponse->FahrenheitToCelsiusResult->c_str();
                            std::cout << z << 'n';
                        }
                    else
                        {
                            temp.soap_stream_fault(std::cerr);
                        }
                    break;

                default: std::cout << "Erro! Codigo de operação desconhecido!" << 'n' << "Por favor, tente novamente!" << 'n';
                    break;
            }
    }
    return 0;
}

这是服务器

#include "soapTempConvertSoapService.h"
#include "TempConvertSoap.nsmap"
#include <iostream>
#include <stdlib.h>
using namespace std;
#include <string>
#include <sstream>
#include <utility>
std::string s = std::string();
std::string str = std::string();
int demp;
int main(int argc, char **argv)
    {
        TempConvertSoapService temp;
    if (argc < 2)
        {
            temp.serve();   /* serve as CGI application */
        }
    else
        {
            int port = atoi(argv[1]);
            if (!port)
                {
                    fprintf(stderr, "Usage: tempserver++ <port>n");
                    exit(0);
                }
            /* run iterative server on port until fatal error */
            if (temp.run(port))
                {
                    temp.soap_stream_fault(std::cerr);
                    exit(-1);
                }
        }
    return 0;
}
int TempConvertSoapService::FahrenheitToCelsius(_ns1__FahrenheitToCelsius     *ns1__FahrenheitToCelsius, _ns1__FahrenheitToCelsiusResponse     *ns1__FahrenheitToCelsiusResponse)
{
        str = (*ns1__FahrenheitToCelsius->Fahrenheit);
        istringstream convert(str);
        stringstream konvert;

        if ( !(convert >> demp) )
            {
                demp = 0;
            }
        else
            {
                demp =  (demp  -  32)  *  5/9;
                konvert << demp;
                s = konvert.str();
                ns1__FahrenheitToCelsiusResponse->FahrenheitToCelsiusResult = &s;
            }   
        return SOAP_OK;
}
int TempConvertSoapService::CelsiusToFahrenheit(_ns1__CelsiusToFahrenheit *ns1__CelsiusToFahrenheit, _ns1__CelsiusToFahrenheitResponse *ns1__CelsiusToFahrenheitResponse)
{
        str = (*ns1__CelsiusToFahrenheit->Celsius);
        istringstream convert(str);
        stringstream konvert;
        demp;
        if ( !(convert >> demp) )
            {
                demp = 0;
            }
        else
            {
                demp =  demp  *  9/5 + 32;
                konvert << demp;
                s = konvert.str();
                    ns1__CelsiusToFahrenheitResponse->CelsiusToFahrenheitResult = &s;
            }
        return SOAP_OK;
}
    int     TempConvertSoapService::FahrenheitToCelsius_(_ns1__FahrenheitToCelsius     *ns1__FahrenheitToCelsius, _ns1__FahrenheitToCelsiusResponse     *ns1__FahrenheitToCelsiusResponse)
    {
        str = (*ns1__FahrenheitToCelsius->Fahrenheit);
        istringstream convert(str);
        stringstream konvert;
        demp;
        if ( !(convert >> demp) )
            {
                demp = 0;
            }
        else
            {
                demp =  (demp  -  32)  *  5/9;
                konvert << demp;
                s = konvert.str();
                    ns1__FahrenheitToCelsiusResponse->FahrenheitToCelsiusResult = &s;
            }   
        return SOAP_OK;
}
    int     TempConvertSoapService::CelsiusToFahrenheit_(_ns1__CelsiusToFahrenheit     *ns1__CelsiusToFahrenheit, _ns1__CelsiusToFahrenheitResponse     *ns1__CelsiusToFahrenheitResponse)
{
        str = (*ns1__CelsiusToFahrenheit->Celsius);
        istringstream convert(str);
        stringstream konvert;
        demp;
        if ( !(convert >> demp) )
            {
                demp = 0;
            }
        else
            {
                demp =  demp  *  9/5 + 32;
                konvert << demp;
                s = konvert.str();
                ns1__CelsiusToFahrenheitResponse->CelsiusToFahrenheitResult = &s;
            }
        return SOAP_OK;
}

谢谢!

您从不初始化_ns1__FahrenheitToCelsius *ns1__FahrenheitToCelsius和类似的变量,而是尝试访问它们的数据成员(例如ns1__FahrenheitToCelsius->Fahrenheit = &s;)。看起来这些可能只是对象本身,而不是指针。

最新更新