linux下gsoap的初次使用 -- c风格加法实例
摘自:
http://blog.csdn.net/jinpw/article/details/3346844
https://www.cnblogs.com/dkblog/archive/2011/08/19/2145942.html
这两天,接到一个项目,需要在linux程序中调用远程的web应用,通过soap协议。开始上网查了下资料,发现了gsoap库这个好东东^_^。继续在网上搜索例子代码,发现基本都不可编译通过,于是便一边学习一边写了这个最简单的例子,希望对后来者起到一点帮助。
- 对gsoap的简单介绍,请自己参阅http://gsoap2.sourceforge.net/
下载相应的包,主要有2个工具和源代码:
wsdl2h -o outfile.h infile.wsdl 实现wsdl文件到h文件的数据映射
soapcpp2 -c outfile.h生成相应的底层通信stub,strech程序
- 下面这个简单的例子实现的是在客户端输入2个数字,然后远程调用服务端的加法函数,最后返回结果给客户端。
在这里我们不需要wsdl的文件,可以直接从.h文件来生成代码。我们定义一个函数声明文件,用来定义接口函数,名称为add.h,内容如下:
- //gsoapopt cw
- //gsoap ns2 schema namespace: urn:add
- //gsoap ns2 schema form: unqualified
- //gsoap ns2 service name: add
- //gsoap ns2 service type: addPortType
- //gsoap ns2 service port:http://websrv.cs.fsu.edu/~engelen/addserver.cgi
- //gsoap ns2 service namespace: urn:add
- //gsoap ns2 service transport: http://schemas.xmlsoap.org/soap/http
- //gsoap ns2 service method-style: add rpc
- //gsoap ns2 service method-encoding:
- add http://schemas.xmlsoap.org/soap/encoding/
- //gsoap ns2 service method-action: add ""
- int ns2__add( int num1, int num2, int* sum );
然后我们执行soapcpp2 -c add.h,自动生成一些远程调用需要的文件。
接下来我们写一个服务端,创建文件addserver.c
- #include "soapH.h"
- #include "add.nsmap"
- int main(int argc, char **argv)
- {
- int m, s;
- struct soap add_soap;
- soap_init(&add_soap);
- soap_set_namespaces(&add_soap, 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);
- soap_serve(&add_soap);
- soap_end(&add_soap);
- }
- }
- return 0;
- }
- int ns2__add(struct soap *add_soap, int num1, int num2, int *sum)
- {
- *sum = num1 + num2;
- return 0;
- }
我们接着写客户端,文件addclient.c
- #include "soapStub.h"
- #include "add.nsmap"
- 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, namespaces);
- soap_call_ns2__add(&add_soap, server, NULL, num1, num2, sum);
- printf("server is %s, num1 is %d, num2 is %d/n", server, num1, num2);
- 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;
- }
最后写一个测试代码,addtest.c
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- int add(const char *server, int num1, int num2, int *sum);
- int main(int argc, char **argv)
- {
- int result = -1;
- char server[128] = {0};
- int num1;
- int num2;
- int sum;
- if (argc < 4) {
- printf("usage: %s <ip:port> num1 num2 /n", argv[0]);
- exit(1);
- }
- strcpy(server,argv[1]);
- num1 = atoi(argv[2]);
- num2 = atoi(argv[3]);
- result = add(server, num1, num2, ∑);
- if (result != 0) {
- printf("soap error, errcode=%d/n", result);
- } else {
- printf("%d + %d = %d/n", num1, num2, sum);
- }
- return 0;
- }
到此为止,我们自己的代码已经编写完毕,现在我们来编译服务端和客户端
注意:编译的时候我们需要gsoap包里的源代码文件,把stdsoap2.c和stdsoap2.h文件拷贝到当前目录
我们写一个Makefile文件:
- GSOAP_ROOT = /root/gsoap-2.7/gsoap
- WSNAME = add
- CC = g++ -g -DWITH_NONAMESPACES
- INCLUDE = -I$(GSOAP_ROOT)
- SERVER_OBJS = soapC.o stdsoap2.o soapServer.o $(WSNAME)server.o
- CLIENT_OBJS = soapC.o stdsoap2.o soapClient.o $(WSNAME)client.o $(WSNAME)test.o
- all: server
- server: $(SERVER_OBJS)
- $(CC) $(INCLUDE) -o $(WSNAME)server $(SERVER_OBJS)
- client: $(CLIENT_OBJS)
- $(CC) $(INCLUDE) -o $(WSNAME)test $(CLIENT_OBJS)
- cl:
- rm -f *.o *.xml *.a *.wsdl *.nsmap soapH.h $(WSNAME)Stub.* $(WSNAME)server ns.xsd $(WSNAME)test
然后我们执行make,即可生产addserver程序;make client,生成addtest程序。
让server跑起来,执行./addserver 6666
终端打印出“Socket connection successful: master socket = 3”,那么你的server已经在前台run起来了;
运行客户端,./addtest ip:port num1 num2,返回加法的结果。
OK,一个最简单的soap调用的例子完成了,进深一步的学习请参考http://gsoap2.sourceforge.net/
linux下gsoap的初次使用 -- c风格加法实例的更多相关文章
- Onvif开发之Linux下gsoap的使用及移植
一直以来都是在CSDN上面学习别人的东西,很多次想写点什么但是又无从写起.由于公司项目需要,最近一段时间在研究onvif,在网上找了很多资料,发现资料是非常多,但是很少有比较全的资料,或者资料太多无从 ...
- Linux下的压缩解压缩命令详解及实例
实例:压缩服务器上当前目录的内容为xxx.zip文件 zip -r xxx.zip ./* 解压zip文件到当前目录 unzip filename.zip ====================== ...
- Linux下gsoap实现webservice功能
蓝字为关键字,等号=后面为关键字值. 一.介绍 我们用的webservice是根据gsoap编译工具来实现,gSOAP的编译器能够自动的将用户定义的本地化的C或C++数据类型转变为符合XML语法的数据 ...
- Linux下配置环境变量的几个方法实例
场景:一般来说,配置交叉编译工具链的时候需要指定编译工具的路径,此时就需要设置环境变量.例如我的mips-linux-gcc编译器在“/opt/au1200_rm/build_tools/bin”目录 ...
- Linux下面向TCP连接的C++ Socket编程实例
Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.即Socket提供了操作上述特殊文件的接口,使用这些接口可以实现网络编程. Socket通信流程图 TCP(Transmis ...
- Linux下onvi支持h265环境的的搭建:gsoap的安装及生产.c .h文件
1. 下载gsoap :http://www.genivia.com/products.html#notice,既Open Source gSOAP版本,并解压进入目录安装,configure后面 ...
- Linux下用gSOAP开发Web Service服务端和客户端程序
网上本有一篇流传甚广的C版本的,我参考来实现,发现有不少问题,现在根据自己的开发经验将其修改,使用无误:另外,补充同样功能的C++版本,我想这个应该更有用,因为能用C++,当然好过受限于C. 1.gS ...
- linux下不错的小软件
1.Shutter截图软件 可以完成基本截图功能,而且还有图片编辑功能,可以涂鸦添加水印等. 以下的截图全部归功于shutter软件. 2.VLC media player 媒体播放器 3.Termi ...
- Linux下AT&T汇编语法格式与Intel汇编语法格式异同
由于绝大多数的国内程序员以前只接触过Intel格式的汇编语言,很少或几乎没有接触过AT&T汇编语言,虽然这些汇编代码都是Intel风格的.但在Unix和Linux系统中,更多采用的还是AT&a ...
随机推荐
- Python 单元测试 之setUP() 和 tearDown()
setUp:表示前置条件,它在每一个用例执行之前必须会执行一次 setUp可以理解为我们需要自动化测试时,需要打开网页窗口,输入对应测试地址,这一些属于前置条件. tearDown:表示释放资源,它在 ...
- 自动化测试,基于selenium/appnium 学习
1. 搭建环境,配置java,安装tomcat 7.0,运行eclipse
- 【BZOJ3745】[Coci2015]Norma cdq分治
[BZOJ3745][Coci2015]Norma Description Input 第1行,一个整数N: 第2~n+1行,每行一个整数表示序列a. Output 输出答案对10^9取模后的结果. ...
- 如何在MySQL中分配innodb_buffer_pool_size
如何在MySQL中分配innodb_buffer_pool_size innodb_buffer_pool_size是整个MySQL服务器最重要的变量. 1. 为什么需要innodb buffer p ...
- 在win7下使用git和gitlab进行code review
1.安装 Git-2.6.3-64-bit.exe 下载地址:http://pan.baidu.com/s/1hqGvwnq 2.根据收到的邮件进入gitlab网站,并修改密码登陆 3.新建一个文件 ...
- Swift 烧脑体操(四) - map 和 flatMap
前言 Swift 其实比 Objective-C 复杂很多,相对于出生于上世纪 80 年代的 Objective-C 来说,Swift 融入了大量新特性.这也使得我们学习掌握这门语言变得相对来说更加困 ...
- 郝健: Linux内存管理学习笔记-第2节课【转】
本文转载自:https://blog.csdn.net/juS3Ve/article/details/80035753 摘要 slab./proc/slabinfo和slabtop 用户空间mallo ...
- 51nod 1610
题目 神犇题解 所以说鄙人的姿势水平完全不够啊OTZ. 很naive的想法是O(T*v*m)的,据说卡一卡可以过去.题目要求的东西其实是这个: $ \sum\limits_{i = 1}^v {\mu ...
- Mysql中文检索匹配与正则
今天在用sql模糊查询包含字母d的时候,发现一些不包含此字母的也被查询出来了: SELECT * FROM custom WHERE custom_realname LIKE '%d%' 查询了一下, ...
- Java微信公众平台开发_03_消息管理之被动回复消息
GitHub源码:https://github.com/shirayner/weixin_gz 一.本节要点 1.回调url 上一节,我们启用服务器配置的时候,填写了一个服务器地址(url),如下图, ...