一.系统环境 2
二.gSOAP的简要使用例子 2
三.图示说明 6
四.要注意的问题 6
五.参考文档 7
六.备注 7

一.系统环境
linux操作系统kernel2.4.2,安装gsoap2.6到目录/usr/local/gsoap
二.gSOAP的简要使用例子
下面是一个简单的例子,实现一个加法运算的WebService,具体功能是cli端输入num1和num2,server端返回一个num1和num2相加的结果sum。

1. 首先,我们需要做的是写一个函数声明文件,来定义接口函数ns__add,文件名字为add.h,内容如下:

//gsoap ns service name: add
//gsoap ns service namespace: http://mail.263.net/add.wsdl
//gsoap ns service location: http://mail.263.net
//gsoap ns service executable: add.cgi
//gsoap ns service encoding: encoded
//gsoap ns schema namespace: urn:add

int ns__add( int num1, int num2, int* sum );

2. 然后我们需要创建文件Makefile,从而利用gsoapcpp2工具由add.h生成一些.xml文件、.c文件和.h文件,这些文件均为自动生成,Makefile的内容如下:

GSOAP_ROOT=/usr/local/gsoap
WSNAME=add
CC=g++ -g -DWITH_NONAMESPACES
INCLUDE=-I $(GSOAP_ROOT)
SERVER_OBJS=$(WSNAME)C.o $(WSNAME)Server.o stdsoap2.o
CLIENT_OBJS=$(GSOAP_ROOT)/env/envC.o $(WSNAME)ClientLib.o stdsoap2.o
ALL_OBJS=${WSNAME}server.o $(WSNAME)C.o $(WSNAME)Server.o ${WSNAME}test.o ${WSNAME}client.o $(WSNAME)ClientLib.o

#总的目标
all:server

${WSNAME}.wsdl:${WSNAME}.h
$(GSOAP_ROOT)/soapcpp2 -p$(WSNAME) -i -n -c ${WSNAME}.h

stdsoap2.o:$(GSOAP_ROOT)/stdsoap2.c
$(CC) -c $?

#编译一样生成规则的.o文件
$(ALL_OBJS):%.o:%.c
$(CC) -c $? $(INCLUDE)

#编译服务器端
server:Makefile ${WSNAME}.wsdl ${WSNAME}server.o $(SERVER_OBJS)
$(CC) ${WSNAME}server.o $(SERVER_OBJS) -o ${WSNAME}server

#编译客户端
client:Makefile ${WSNAME}.wsdl ${WSNAME}client.c ${WSNAME}test.c $(ALL_OBJS) stdsoap2.o
$(CC) ${WSNAME}test.o ${WSNAME}client.o $(CLIENT_OBJS) -o ${WSNAME}test

cl:
rm -f *.o *.xml *.a *.wsdl *.nsmap $(WSNAME)H.h $(WSNAME)C.c $(WSNAME)Server.c $(WSNAME)Client.c $(WSNAME)Stub.* $(WSNAME)$(WSNAME)Proxy.* $(WSNAME)$(WSNAME)Object.* $(WSNAME)ServerLib.c $(WSNAME)ClientLib.c $(WSNAME)server ns.xsd $(WSNAME)test

3.我们先来做一个server端,创建文件addserver.c文件,内容如下:

#include "addH.h"
#include "add.nsmap"

int main(int argc, char **argv)
{
int m, s; /* master and slave sockets */
struct soap add_soap;
soap_init(&add_soap);
soap_set_namespaces(&add_soap, add_namespaces);
if (argc < 2)
{
printf("usage: %s <server_port> \n", argv[0]);
exit(1);
}
else
{
m = soap_bind(&add_soap, NULL, atoi(argv[1]), 100);
if (m < 0)
{
soap_print_fault(&add_soap, stderr);
exit(-1);
}
fprintf(stderr, "Socket connection successful: master socket = %d\n", m);
for ( ; ; )
{
s = soap_accept(&add_soap);
if (s < 0)
{
soap_print_fault(&add_soap, stderr);
exit(-1);
}
fprintf(stderr, "Socket connection successful: slave socket = %d\n", s);
add_serve(&add_soap);//该句说明该server的服务
soap_end(&add_soap);
}
}
return 0;
}
//server端的实现函数与add.h中声明的函数相同,但是多了一个当前的soap连接的参数
int ns__add(struct soap *add_soap, int num1, int num2, int *sum)
{
*sum = num1 + num2;
return 0;
}

4.让我们的server跑起来吧:
shell>make
shell>./addserver 8888
如果终端打印出“Socket connection successful: master socket = 3”,那么你的server已经在前台run起来了,应该是值得高兴的。
打开IE,键入http://本机IP:8888,显示XML,服务已经启动,终端打印出“Socket connection successful: slave socket = 4”,表示服务接收到了一次soap的连接。

5.让我们再来写个客户端(这个只是将soap的客户端函数封装一下,具体的调用参见下面的addtest.c),创建文件addclient.c,内容如下:

#include "addStub.h"
#include "add.nsmap"
/**
* 传入参数:server:server的地址
* num1,num2:需要相加的数
* 传出参数:sum:num1和num2相加的结果
* 返回值:0为成功,其他为失败
*/
int add( const char* server, int num1, int num2, int *sum )
{
struct soap add_soap;
int result = 0;
soap_init(&add_soap);
soap_set_namespaces(&add_soap, add_namespaces);

//该函数是客户端调用的主要函数,后面几个参数和add.h中声明的一样,前面多了3个参数,函数名是接口函数名ns__add前面加上soap_call_
soap_call_ns__add( &add_soap, server, "", num1, num2, sum );
if(add_soap.error)
{
printf("soap error:%d,%s,%s\n", add_soap.error, *soap_faultcode(&add_soap), *soap_faultstring(&add_soap) );
result = add_soap.error;
}
soap_end(&add_soap);
soap_done(&add_soap);
return result;
}

6.我们最终写一个可以运行的客户端调用程序,创建文件addtest.c,内容如下:

#include <stdio.h>
#include <stdlib.h>

int add(const char* server, int num1, int num2, int *sum);

int main(int argc, char **argv)
{
int result = -1;
char* server="http://localhost:8888";
int num1 = 0;
int num2 = 0;
int sum = 0;
if( argc < 3 )
{
printf("usage: %s num1 num2 \n", argv[0]);
exit(0);
}

num1 = atoi(argv[1]);
num2 = atoi(argv[2]);

result = add(server, num1, num2, &sum);
if (result != 0)
{
printf("soap err,errcode = %d\n", result);
}
else
{
printf("%d+%d=%d\n", num1, num2, sum );
}
return 0;
}

7.让我们的client端和server端通讯
shell>make client
shell>./addtest 7 8
当然,你的server应该还在run,这样得到输出结果7+8=15,好了,你成功完成了你的第一个C写的WebService,恭喜。
三.图示说明

四.要注意的问题
1. add.h文件前面的几句注释不能删除,为soapcpp2需要识别的标志
2. 接口函数的返回值只能是int,是soap调用的结果,一般通过soap.error来判断soap的连接情况,这个返回值没有用到。
3. 接口函数的最后一个参数为传出参数,如果需要传出多个参数,需要自己定义一个结构将返回项封装。
4. 在.h文件中不能include别的.h文件,可能不能生效,需要用到某些结构的时候需要在该文件中直接声明。
5. 如果客户端的调用不需要返回值,那么最后一个参数
五.参考文档
1.gsoap主页
http://gsoap2.sourceforge.net

2.跟我一起写Makefile
http://dev.csdn.net/develop/article/20/20025.shtm

3.Web Services: A Technical Introduction(机械工业出版社)
六.备注
192.168.18.233和192.168.18.234的/usr/local/gsoap目录下的3个需要的文件及一个env目录,不是编译安装的,是在别的地方编译好了直接copy过来的(实际编译结果中还有wsdl2h工具及其他一些文件,但是我们的实际开发中只是用到了这3个文件及env目录)。因为时间仓促,本人还没有时间研究编译的问题,相关细节可以查看参考文档1。
在192.168.18.233的/home/weiqiong/soap/sample目录下及192.168.18.234的/tmp/soap/sample目录下有本文讲到的加法运算的例子。

C实现web service相关推荐

  1. Web Service 安全性解决方案(SOAP篇)

    拼吾爱程序人生 » 软件编程 » Visual Studio.NET » Web Service » Web Service 安全性解决方案(SOAP篇) Web Service 安全性解决方案(SO ...

  2. Web service到底是什么?

    Web service到底是什么:在什么情况下你应该使用Web service. 分布式应用程序和浏览器 研究一下当前的应用程序开发,你会发现一个绝对的倾向:人们开始偏爱基于浏览器的瘦客户应用程序.这 ...

  3. web service 和 remoting 有什么区别

    其实现的原理并没有本质的区别,在应用开发层面上有以下区别: 1.Remoting可以灵活的定义其所基于的协议,如果定义为HTTP,则与Web Service就没有什么区别了,一般都喜欢定义为TCP,这 ...

  4. 使用axis开发web service服务端

    一.axis环境搭建 1.安装环境 JDK.Tomcat或Resin.eclipse等. 2.到 http://www.apache.org/dyn/closer.cgi/ws/axis/1_4 下载 ...

  5. WCF实现RESTFul Web Service

    共同学习了前面一些概念,终于开始正题了哈.RESTful的Web Service调用直观,返回的内容容易解析.这里先会描述一个简单的场景--Web Service提供一个方法来搜索个人信息,传入人名, ...

  6. web service 项目 和 普通 web项目 的 区别

    web service 面向的是开发者(需要再次开发) 普通web 面向的是用户(直接使用) 转载于:https://www.cnblogs.com/zno2/p/5612024.html

  7. 从WEB SERVICE 上返回大数据量的DATASET

    前段时间在做一个项目的时候,遇到了要通过WEB SERVICE从服务器上返回数据量比较大的DATASET,当然,除了显示在页面上以外,有可能还要用这些数据在客户端进行其它操作.查遍了网站的文章,问了一 ...

  8. postman请求soap 请求_postman测试调用web service asmx

    大多数情况都是使用postman来测试调用Restful接口,但是有些老系统用web service写的接口还是不少见.最近我就遇到了,我们之前买的一个系统居然是.net 写的web service, ...

  9. Web Service 的工作原理

    Web Service基本概念 Web Service也叫XML Web Service WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求,轻量级的 ...

  10. Web service是什么?

    一.Web service的概念 想要理解Web service,必须先理解什么是Service(服务). 传统上,我们把计算机后台程序(Daemon)提供的功能,称为"服务"(s ...

最新文章

  1. 淺談Raid Cache Memory上應用的問題和實踐
  2. ASP实例:利用缓存提高数据显示效率
  3. 怎么解决tomcat占用8080端口问题
  4. 计算机网路【2】数据链路层
  5. JavaEE实战班第十七天
  6. 云服务器,Linux上安装xampp来搭建node,api
  7. Math 对象的扩展
  8. 江苏省计算机学业水平测试时间,江苏2018年高中学业水平考试时间公布
  9. 用c语言编写最大最小值_C语言学习教程,用C语言编写扫雷游戏
  10. 为什么用Ghost备份后会有两个文件?
  11. 浅谈css3长度单位rem,以及移动端布局技巧
  12. 电脑蓝屏代码大全合集
  13. ECshop二次开发从开始
  14. OpenFoam安装swak4Foam
  15. ROS2+nav2+激光雷达导航(上)
  16. excel手机版_微软开发于手机端的办公软件!
  17. 【解题报告】2014ACM/ICPC亚洲区广州站
  18. CSS如何写出圆圈1(详细)
  19. 京东主图视频上传,如何关联商品投放?
  20. 64位Ubuntu安装PPStream

热门文章

  1. Android UI(四)云通讯录项目之云端更新进度条实现
  2. SRM 625 DIV2
  3. 去掉chrome、safari input或textarea在得到焦点时出现黄色边框的方法
  4. UIActionSheet 多项弹出框
  5. 安装node.js,CoffeeScript,Express.js,mysql,jade
  6. JavaScript正则表达式 exec
  7. 使用模块化工具Rollup打包自己开发的JS库
  8. Docker Images for MySQL Cluster
  9. 创建设计模式 - 抽象工厂设计模式
  10. 数据可视化组件Grafana详细解读--RedHat/Fedora/CentOS/Oracle上的安装