gsoap 纯C代码实现时soap信息自动添加一层不应该有的元素

lilei_991023 2018-08-16 05:56:12
最近在看CWMP协议,从Broadband官网下载了CWMP协议格式的schema文件 cwmp-1-1.xsd

然后用gsoap2.8.69版本中的 wsdl2h转化xsd为头文件,并在头文件里面手工添加方法(xsd文件不包含方法,wsdl文件才会包含,但是官方未提供),再用soapcpp2 转化为 soap通信的源代码文件,由于只会C语言所以都是C格式,非Cpp。

上面过程简单描述如下:cwmp-1-1.xsd文件(通过wsdl2h)-->原始头文件(通过手工添加方法)-->修改后的头文件(通过soapcpp2)-->符合cwmp协议的源代码

手工添加代码类似这样:

int CWMP__Inform(struct _CWMP__Inform *Inform_Message, struct _CWMP__InformResponse *InformRes_Message);


调试,发现了一个问题,使用gsoap时,soap信息自动添加一层不应该有的元素,正确的应该是

<cwmp:Inform>
<DeviceId xsi:type="cwmp:DeviceIdStruct">
<Manufacturer xsi:type="xsd:string">kingsoft </Manufacturer>
<OUI xsi:type="xsd:string">FFFFFF </OUI>
<ProductClass xsi:type="xsd:string">UTM </ProductClass>
<SerialNumber xsi:type="xsd:string">FFFFFFFFF</SerialNumber>
</DeviceId>
<Event xsi:type="SOAP-ENC:Array" SOAP-ENC:arrayType="cwmp:EventStruct[0]"></Event>
<MaxEnvelopes xsi:type="xsd:unsignedInt">1</MaxEnvelopes>
<CurrentTime xsi:type="xsd:dateTime">2010-04-01T05:15:35</CurrentTime>
<RetryCount xsi:type="xsd:unsignedInt">0</RetryCount>
<ParameterList xsi:type="SOAP-ENC:Array" SOAP-ENC:arrayType="cwmp:ParameterValueStruct[0]"></ParameterList>
</cwmp:Inform>

但是实际上

<cwmp:Inform>
<cwmp:InformMessage>
<DeviceId xsi:type="cwmp:DeviceIdStruct">
<Manufacturer xsi:type="xsd:string">kingsoft </Manufacturer>
<OUI xsi:type="xsd:string">FFFFFF </OUI>
<ProductClass xsi:type="xsd:string">UTM </ProductClass>
<SerialNumber xsi:type="xsd:string">FFFFFFFFF</SerialNumber>
</DeviceId>
<Event xsi:type="SOAP-ENC:Array" SOAP-ENC:arrayType="cwmp:EventStruct[0]"></Event>
<MaxEnvelopes xsi:type="xsd:unsignedInt">1</MaxEnvelopes>
<CurrentTime xsi:type="xsd:dateTime">2010-04-01T05:15:35</CurrentTime>
<RetryCount xsi:type="xsd:unsignedInt">0</RetryCount>
<ParameterList xsi:type="SOAP-ENC:Array" SOAP-ENC:arrayType="cwmp:ParameterValueStruct[0]"></ParameterList>
</cwmp:InformMessage>
</cwmp:Inform>


有的攻略上说,把.h文件的函数参数分拆就可以了。


问题来啦:怎么把.h文件的函数参数分拆呢???
...全文
171 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
cjzzmdn 2018-08-21
  • 打赏
  • 举报
回复
lz是想要匿名参数吗
在soapcpp2.exe处理的头文件中,形参名以两个下划线开始试试(虽然文档中说是1个下划线)。例如

int CWMP__Inform(struct _CWMP__Inform *__Inform_Message, struct _CWMP__InformResponse *InformRes_Message);

24,855

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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