加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

gsoap入门--用goap写一个加法的WebService

发布时间:2020-12-17 00:30:19 所属栏目:安全 来源:网络整理
导读:??? 毕业设计要用到WebService,但是本人不会java,就想着用c/c++来写WebService。网上查找了相关资料,就知道了gsoap。 ??? 从gsoap的官方网站http://www.cs.fsu.edu/~engelen/soap.html中下载了最新版本,里面会有相关技术文档。 ??? 本人觉得学习一个新的

??? 毕业设计要用到WebService,但是本人不会java,就想着用c/c++来写WebService。网上查找了相关资料,就知道了gsoap。

??? 从gsoap的官方网站http://www.cs.fsu.edu/~engelen/soap.html中下载了最新版本,里面会有相关技术文档。

??? 本人觉得学习一个新的东西最快捷的方式就是马上动手实践了,这样可以大大的加深的理解原理和使用方法。而如果只是停留在文档的学习上,那学习的进度会很慢,因为知识点的不断增加,仅仅靠记忆很难理清楚各个点的作用和相互关系。所以一般就可以通过动手实验,把知识点深化到经验层面,一点点地深入就会变得简单许多。(写些这些仅作为个人学习方法的总结。)

?? 转入正题,先简单介绍下。

?? 在bin文件下有两个已经编译好的程序:soapcpp2,wsdl2h。

?? 官方文档中有两句:???

  • The wsdl2h WSDL/schema importer and data binding mapper tool.
  • The soapcpp2 stub/skeleton compiler and code generator.

?? wsdl2h是一个服务导入和数据绑定、转换的工具,soapcpp2则是寸根/框架的编译器和代码生成器。至于什么是寸根,我的理解就是相当于一种上下文运行环境。

?? 注意这两个程序是可以再进行定制编译的,因为需要一些特殊的服务或功能,可以在开发时自行进行重新配置和编译。

?? 现在转入例子说明。

?? 这个例子我写了一个加法的webService。服务器属于单线程程序,直接贴出服务端的代码,文件名为:StandaloneAdd.c:

? #include "soapH.h"
#include "add.nsmap"

int main()
{
?? ?struct soap soap;
?? ?int master,slave;
?? ?soap_init(&soap);
?? ?master = soap_bind(&soap,"127.0.0.1",18888,100);
?? ?if(master < 0)
?? ??? ?soap_print_fault(&soap,stderr);
?? ?else
?? ?{
?? ??? ?sprintf(stderr,"Socket connection successful:master socket = %dn",master);
?? ?
?? ?while(1)
?? ?{
?? ??? ?slave = soap_accept(&soap);
?? ??? ?if(slave < 0)
?? ??? ?{
?? ??? ??? ?soap_print_fault(&soap,stderr);
?? ??? ??? ?break;
?? ??? ?}
?? ??? ?sprintf(stderr,"accepted connection from IP=%d.%d.%d.%d socket=%d",(soap.ip >> 24)&0xFF,(soap.ip >> 16)&0xFF,(soap.ip >> 8)&0xFF,soap.ip&0xFF,slave);
?? ??? ?if(soap_serve(&soap) != SOAP_OK)
?? ??? ??? ?soap_print_fault(&soap,stderr);
?? ??? ?fprintf(stderr,"request servedn");
?? ??? ?soap_destroy(&soap);
?? ??? ?soap_end(&soap);
?? ?}
?? ?}
?? ?soap_done(&soap);
}

int ns__add(struct soap *soap,double a,double b,double *result)
{
?? ?*result = a + b;
?? ?return SOAP_OK;
}

??

接着写StandaloneAdd.h文件:

//gsoap ns service name:?? ?add Simple StandaloneAdd service
//gsoap ns service style:?? ?rpc
//gsoap ns service enconding:?? ?encoded
//gsoap ns service namespace:?? ?http://localhost/StandaloneAdd.wsdl
//gsoap ns service location:?? ?http://localhost:18888

//gsoap ns schema namesapce:?? ?urn:add

int ns__add(double a,double *result);

需要特别注意的是,这里的注释内容是有作用的,soapcpp2需要根据这些注释内容生成相关文件。location指的是服务的地址,我这里是把服务绑定在本机的端口号为18888的端口上。

现在就可以使用本人开始时候介绍的那两个程序中的一个程序了:soapcpp2。

进入到以上两个文件所在的目录下,将soapcpp2、stdsoap2.c和stdsoap2.h文件复制到此目录下,然后运行一下命令行:

1、$./soapcpp2 -c StandaloneAdd.h

-c参数指明这里生成的文件是纯C的格式的文件。

2、$cc -o StandaloneAdd StandaloneAdd.c stdsoap2.c soapC.c soapServer.c

查看当前目录,会发现新生成了很多文件,其中有个可执行文件StandaloneAdd和wsdl服务文件。

到目前为止,服务端的程序就已经完成了,可以运行StandaloneAdd程序来提供服务。还有就是通过wsdl文件来发布服务,不过这种方式为还没有试过。


接下来通过编写服务端程序来测试一下。

客户端测试文件ClientTest.c代码如下:

#include "soapH.h"
#include "add.nsmap"

const char server[] = "http://localhost:18888";

int main(int argc,char **argv)
{
?? ?struct soap soap;
?? ?double a,b,result;
?? ?soap_init1(&soap,SOAP_XML_INDENT);
?? ?a = strtod(argv[2],NULL);
?? ?b = strtod(argv[3],NULL);
?? ?
?? ?soap_call_ns__add(&soap,server,"",a,&result);
?? ?if(soap.error)
?? ?{
?? ??? ?soap_print_fault(&soap,stderr);
?? ??? ?exit(1);
?? ?}
?? ?else
?? ??? ?printf("result = %gn",result);
?? ?soap_destroy(&soap);
?? ?soap_end(&soap);
?? ?soap_done(&soap);
?? ?return 0;
?? ?
}

编辑完后,运行以下命令行:

$cc -o ClientTest ClientTest.c stdsoap2.c soapC.c soapClient.c

这时会在当前目录下生成目标文件ClientTest。这就是可执行文件。

现在一个终端下运行服务器端程序,开启服务:./StandaloneAdd

然后在另一个终端运行客户端测试程序:./ClientTest add 32 23

然后终端会打印出:result = 55

OK,That is over!

此文仅仅作为学习记录笔记,完全按照实验过错和结果撰写,如果大的出入,望多多指出,感谢额。。。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读