python通过suds调用C++服务,soap解析报错,求指导

hbsgz 2015-10-22 09:04:49
python客户端通过suds调用C++服务器时出现,C++端已接收到响应的soap命令,在soap_begin_recv接口中的fparse调用处返回错误码soap error = 1000(即SOAP_STOP), 解析失败;用C++客户端调用webservice则能正常响应,求大神们指引!

python代码如下:
from suds.client import Client

url = 'http://127.0.0.1:8000/?wdsl'
client = Client(url)
print (client)

result = client.service.GetSum(1,2)

C++代码:

int http_get(struct soap *soap)
{
FILE*fd = NULL;
fd = fopen("KDNet.wsdl", "rb"); //open WSDL file to copy
if (!fd)
{
return 404; //return HTTP not found error
}
soap->http_content = "text/xml"; //HTTP header with text /xml content
soap_response(soap,SOAP_FILE);
for(;;)
{
size_t r = fread(soap->tmpbuf,1, sizeof(soap->tmpbuf), fd);
if (!r)
{
break;
}
if (soap_send_raw(soap, soap->tmpbuf, r))
{
break; //cannot send, but little we can do about that
}
}
fclose(fd);
soap_end_send(soap);
return SOAP_OK;
}

void main()
{
CBindingServer cBindingServer;
cBindingServer.accept_flags |= SO_LINGER;
cBindingServer.accept_timeout = 5;
cBindingServer.linger_time = 1;
cBindingServer.WeatherWSSoapService_init(SOAP_IO_DEFAULT, SOAP_IO_DEFAULT);

cBindingServer.fget = http_get;

SOCKET hSoap = cBindingServer.bind(NULL, 8000, 100);
if (INVALID_SOCKET == hSoap)
{
cBindingServer.destroy();
return;
}

while(1)
{
SOCKET hSocket = cBindingServer.accept(); //python命令可以收到
if (INVALID_SOCKET == hSocket)
{
Sleep(10);
continue;
}

CBindingServer * pSoap = cBindingServer.copy();
int nRet = pSoap->serve(); //这个里面解析失败,直接进入SOAP_STOP
printf("server error %d\n", nRet);
}
cBindingServer.destroy();
soap_end(&cBindingServer);
soap_done(&cBindingServer);

return;
}

BindingServer 类中方法实现:
int BindingServer ::GetSum(_ns1__GetSumReq *ns1__GetSumReq, _ns1__GetSumRsp *ns1__GetSumRsp)
{
printf("!!!!!!!\n");
return 0;
}

wsdl文件内容:
<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="../ver20/util/onvif-wsdl-viewer.xsl"?>
<wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap12/"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:trp="http://www.hh.com.cn/ver10/HFS/wsdl"
targetNamespace="http://www.hh.com.cn/ver10/HFS/wsdl">
<wsdl:types>
<xs:schema targetNamespace="http://www.hh.com.cn/ver10/HFS/wsdl"
xmlns:tt="http://www.hh.com.cn/ver10/schema/HFSStruct/"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified" version="1.0">
<xs:import namespace="http://www.hh.com.cn/ver10/schema/HFSStruct/" schemaLocation="HFSStruct.xsd" />
<!-- Message Request/Responses elements -->


<!-- GetSumReq -->
<xs:element name="GetSumReq">
<xs:complexType>
<xs:sequence>
<xs:element name="nFirst" type="xs:unsignedInt" minOccurs="1" maxOccurs="1" />
<xs:element name="nSecond" type="xs:unsignedInt" minOccurs="1" maxOccurs="1" />
</xs:sequence>
</xs:complexType>
</xs:element>
<!-- GetSumRsp -->
<xs:element name="GetSumRsp">
<xs:complexType>
<xs:sequence>
<xs:element name="nErrorCode" type="xs:unsignedInt" minOccurs="1" maxOccurs="1" />
<xs:element name="nSum" type="xs:unsignedInt" minOccurs="1" maxOccurs="1" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
</wsdl:types>

<wsdl:message name="GetSumReq">
<wsdl:part name="parameters" element="trp:GetSumReq"/>
</wsdl:message>
<wsdl:message name="GetSumRsp">
<wsdl:part name="parameters" element="trp:GetSumRsp"/>
</wsdl:message>

<wsdl:portType name="Port">
<wsdl:operation name="GetSum">
<wsdl:input message="trp:GetSumReq"/>
<wsdl:output message="trp:GetSumRsp"/>
</wsdl:operation>
</wsdl:portType>

<wsdl:binding name="Binding" type="trp:Port">
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>

<wsdl:operation name="GetSum">
<soap:operation soapAction="http://www.kedacom.com.cn/ver10/KD/wsdl/GetSum"/>
<wsdl:input>
<soap:body parts="parameters" use="literal"/>
</wsdl:input>
<wsdl:output>
<soap:body parts="parameters" use="literal"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>

<wsdl:service name="WebService">
<wsdl:port name="WebServiceSoap" binding="trp:Binding">
<soap:address location="http://localhost:1552/WebService" />
</wsdl:port>
</wsdl:service>
</wsdl:definitions>




这两天搞得我蛋都快碎了,不知是协议之前匹配是否有问题,或者有没大神能够提供一整套python通过suds调用C++服务的demo,万分感谢
...全文
262 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2019-01-16
  • 打赏
  • 举报
回复
不要做A语言代码修改为B语言代码的无用功。
也不要做用A语言代码直接调用B语言代码库这样复杂、这样容易出错的傻事。
只需让A、B语言代码的输入输出重定向到文本文件,或修改A、B语言代码让其通过文本文件输入输出。
即可很方便地让A、B两种语言之间协调工作。
比如:
A将请求数据写到文件a.txt,写完后改名为aa.txt
B发现aa.txt存在时,读取其内容,调用相应功能,将结果写到文件b.txt,写完后删除aa.txt,再将b.txt改名为bb.txt
A发现bb.txt存在时,读取其内容,读完后删除bb.txt
以上A可以替换为任何一种开发语言或开发环境,B可以替换为任何一种与A不同的开发语言或开发环境。
除非A或B不支持判断文件是否存在、文件读写和文件更名。
但是谁又能举出不支持判断文件是否存在、文件读写和文件更名的开发语言或开发环境呢?
可以将临时文件放在RamDisk上提高效率减少磨损磁盘。
数据的结构很复杂的话,文本文件的格式问题可参考json或xml

共享临时文本文件这种进程之间的通讯方法相比其它方法的优点有很多,下面仅列出我现在能想到的:
·进程之间松耦合
·进程可在同一台机器上,也可跨机,跨操作系统,跨硬件平台,甚至跨国。
·方便调试和监视,只需让第三方或人工查看该临时文本文件即可。
·方便在线开关服务,只需删除或创建该临时文本文件即可。
·方便实现分布式和负载均衡。
·方便队列化提供服务,而且几乎不可能发生队列满的情况(除非硬盘空间满)
·……

“跨语言、跨机,跨操作系统,跨硬件平台,跨国,跨*.*的”苦海无边,
回头是“使用共享纯文本文件进行信息交流”的岸!
spy14414 2019-01-15
  • 打赏
  • 举报
回复
大哥,这个问题你解决了吗
junran116 2015-10-28
  • 打赏
  • 举报
回复
抓包发现格式不一样
  • 打赏
  • 举报
回复
试下用 WSExplorer 来捕抓一下发送的消息,看格式和C++调用的格式是否一样.

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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