webservice的服务端c++实现的问题

maomao19850220 2009-03-20 11:46:31
我用c++写一个webservice服务(运行在Solaris下),我的做法是首先写好wsdl,然后用gsoap提供的工具wsdl2h.exe和soapcpp2.exe来生成一堆文件(.h,.cpp.,.xml等)
然后开始写了一个服务端(调用的方法的传入参数是一个vector<string>,传出参数是vector<自定义一个类>),写好了编译完了,然后开始运行。
然后又写了一个客户端,连接后台的服务端(Solaris运行的服务端):传入一个string=“xx”,然后后台的服务端接收到了该字符串"xx“,然后后台(Solaris服务端)返回固定的vector<一个类对象(值是写死的,因为只是一个测试嘛)>,服务端的函数(当然是客户端调用的接口)的返回值参数都已经获得值了(能打印出来),然后运行到这里后,后台Solaris的服务端程序就死掉了,提示 Segmentation Fault(coredump),产生了core文件后,我dbx看了一下,都是说soap的一些库函数(soap_string_out(soap=0x,,,), soap_out_PointerTostd__string(), soap_out_PointerTostd__string(soap =,,))出错了。而且返回值参数的值不能返回给客户端,客户端调用该函数的返回值是-1.奇怪了!!!


跪求各位高人,指点一下迷津。。。感激不尽!!!

在线等。。。
...全文
469 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
提示 Segmentation Fault(coredump),产生了core文件后

应该哪里内存越界了。
maomao19850220 2009-03-20
  • 打赏
  • 举报
回复
#include <soapH.h>
#include <stdsoap2.h>
#include <soapCMDInfoServiceSoapService.h>
#include <CMDInfoServiceSoap.nsmap>

#include <iostream>
#include <string>
#include <vector>
#include <CMDInfo.h>

#include <GSoapTemplate.h>
#include <GSoapTemplate.cpp>
#include <Trim.h>
#include <TAsynLog.h>
#include <string>
#include <iostream>
using namespace std;

int ACE_TMAIN (int argc, ACE_TCHAR *argv[])
{
long port;
if(argc>=2)
{
port=atoi(argv[1]);
}
else
{
port=9400;
}
TGsoapService<CMDInfoServiceSoapService> Server(port,10);//自己用ACE写的一个模板类,有例子证明是可以用的,不是这里有问题的。
cout<<"server will start..."<<endl;
Server.run();
return 1;
}
/*返回指令查询的信息*/
int CMDInfoServiceSoapService::GetCMDInfo(_ns1__GetCMDInfo *ns1__GetCMDInfo, _ns1__GetCMDInfoResponse *ns1__GetCMDInfoResponse)
{
struct soap *soap1;
/*写异步日志*/
TAsynLog AsynLog("CMDInfoService");
AsynLog.WriteLog("[%d,%s] 指令查询 GetCMDInfo start",__LINE__,__FILE__);
/*查询的指令名*/
vector<string> vecCMDName;
cout<<"ns1__GetCMDInfo->CMDNames->string.size() = "<<ns1__GetCMDInfo->CMDNames->string.size()<<endl;
for(int i=0;i<ns1__GetCMDInfo->CMDNames->string.size();i++)
{
cout<<"ns1__GetCMDInfo->CMDNames->string = "<<ns1__GetCMDInfo->CMDNames->string[i]<<endl;
vecCMDName.push_back(ns1__GetCMDInfo->CMDNames->string[i]);
}
/*存放指令结果信息*/
vector<CMDInfo> vectNetInfoResult;
vectNetInfoResult.clear();
CMDInfo vectNetInfoResulti;
vectNetInfoResulti.m_strBigClass="m_strBigClass";
vectNetInfoResulti.m_strCmd="m_strCmd";
vectNetInfoResulti.m_strCmdFunc="m_strCmdFunc";
vectNetInfoResulti.m_strCmdName="m_strCmdName";
vectNetInfoResulti.m_strExample="m_strExample";
vectNetInfoResulti.m_strMachineType="m_strMachineType";
vectNetInfoResulti.m_strNotice="m_strNotice";
vectNetInfoResulti.m_strRemark="m_strRemark";
vectNetInfoResulti.m_strSmallClass="m_strSmallClass";
vectNetInfoResulti.m_strSupplier="m_strSupplier";

vectNetInfoResult.push_back(vectNetInfoResulti);
cout<<"vectNetInfoResult[0].m_strSupplier = "<<vectNetInfoResult[0].m_strSupplier<<endl;

ns1__ArrayOfCMDInfo *ArrayOfNeInfo=new ns1__ArrayOfCMDInfo;
cout<<"vectNetInfoResult.size() = "<<vectNetInfoResult.size()<<endl;
for(int i=0;i<vectNetInfoResult.size();i++)
{
ns1__CMDInfo NeInfoNode;
NeInfoNode.m_USCOREstrBigClass=new string;
NeInfoNode.m_USCOREstrCmd=new string;
NeInfoNode.m_USCOREstrCmdFunc=new string;
NeInfoNode.m_USCOREstrCmdName=new string;
NeInfoNode.m_USCOREstrExample=new string;
NeInfoNode.m_USCOREstrMachineType=new string;
NeInfoNode.m_USCOREstrNotice=new string;
NeInfoNode.m_USCOREstrRemark=new string;
NeInfoNode.m_USCOREstrSmallClass=new string;
NeInfoNode.m_USCOREstrSupplier=new string;

memset(NeInfoNode.m_USCOREstrBigClass,'\0',sizeof(NeInfoNode.m_USCOREstrBigClass));
memset(NeInfoNode.m_USCOREstrCmd,'\0',sizeof(NeInfoNode.m_USCOREstrCmd));
memset(NeInfoNode.m_USCOREstrCmdFunc,'\0',sizeof(NeInfoNode.m_USCOREstrCmdFunc));
memset(NeInfoNode.m_USCOREstrCmdName,'\0',sizeof(NeInfoNode.m_USCOREstrCmdName));
memset(NeInfoNode.m_USCOREstrExample,'\0',sizeof(NeInfoNode.m_USCOREstrExample));
memset(NeInfoNode.m_USCOREstrMachineType,'\0',sizeof(NeInfoNode.m_USCOREstrMachineType));
memset(NeInfoNode.m_USCOREstrNotice,'\0',sizeof(NeInfoNode.m_USCOREstrNotice));
memset(NeInfoNode.m_USCOREstrRemark,'\0',sizeof(NeInfoNode.m_USCOREstrRemark));
memset(NeInfoNode.m_USCOREstrSmallClass,'\0',sizeof(NeInfoNode.m_USCOREstrSmallClass));
memset(NeInfoNode.m_USCOREstrSupplier,'\0',sizeof(NeInfoNode.m_USCOREstrSupplier));

NeInfoNode.m_USCOREstrBigClass=&vectNetInfoResult[0].m_strBigClass;
NeInfoNode.m_USCOREstrCmd=&vectNetInfoResult[0].m_strCmd;
NeInfoNode.m_USCOREstrCmdFunc=&vectNetInfoResult[0].m_strCmdFunc;
NeInfoNode.m_USCOREstrCmdName=&vectNetInfoResult[0].m_strCmdName;
NeInfoNode.m_USCOREstrExample=&vectNetInfoResult[0].m_strExample;
NeInfoNode.m_USCOREstrMachineType=&vectNetInfoResult[0].m_strMachineType;
NeInfoNode.m_USCOREstrNotice=&vectNetInfoResult[0].m_strNotice;
NeInfoNode.m_USCOREstrRemark=&vectNetInfoResult[0].m_strRemark;
NeInfoNode.m_USCOREstrSmallClass=&vectNetInfoResult[0].m_strSmallClass;
NeInfoNode.m_USCOREstrSupplier=&vectNetInfoResult[0].m_strSupplier;

ArrayOfNeInfo->CMDInfo.push_back(&NeInfoNode);
cout<<"ArrayOfNeInfo->CMDInfo = "<<*(ArrayOfNeInfo->CMDInfo[0]->m_USCOREstrCmdName)<<endl;
}
ns1__GetCMDInfoResponse->GetCMDInfoResult=(ns1__ArrayOfCMDInfo*)ArrayOfNeInfo;
cout<<"ns1__GetCMDInfoResponse->GetCMDInfoResult = "<<*(ns1__GetCMDInfoResponse->GetCMDInfoResult->CMDInfo[0]->m_USCOREstrCmdName)<<endl;

AsynLog.WriteLog("[%d,%s] 获取指令信息成功",__LINE__,__FILE__);
return SOAP_OK;
}
maomao19850220 2009-03-20
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 hairetz 的回复:]
提示 Segmentation Fault(coredump),产生了core文件后

应该哪里内存越界了。
[/Quote]

而且我看到自动生成的类里面有成员变量“struct soap * soap”,这个值我从来就没显示的用到过,也没赋过值,不知道是不是这个原因呢?

那soap成员变量又该怎么起作用呢?
maomao19850220 2009-03-20
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 hairetz 的回复:]
提示 Segmentation Fault(coredump),产生了core文件后

应该哪里内存越界了。
[/Quote]

网上很多是这么说的

我会去排查的

但是为什么会提示一些soap的库函数出错呢???

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧