linux 下的gsoap编程






本文引自:http://hi.baidu.com/hesitateboy/item/b1d5dab4cca210e04fc7fd1b









linux 下的gsoap编程

废话下...

好吧,我承认网上的linux下gsoap编程的例子实在是不少.而我之所以还要写这篇文章是因为

人家两个命令搞定一切有木有,

人家几行代码搞定一切有木有,

人家一下搞定的东西我搞了两天都没效果有没有,好吧我情绪有点激动了....

##################################################################


gsoap的安装

我们可以从http://gsoap2.sourceforge.net/来下载,因为不同的gsoap版本可能会有差异导致错误,笔者建议下载gsoap-2.8的版本.


下载完成之后. 解压得到gsoap-2.8, 进入 gsoap-2.8 依次执行

1
2
3
root@luffy-virtual-machine:~ /Desktop/gsoap-2 .8 # ./configure
root@luffy-virtual-machine:~ /Desktop/gsoap-2 .8 # ./make
root@luffy-virtual-machine:~ /Desktop/gsoap-2 .8 # ./make install

这个过程中会遇到n钟问题,我就挑几个影响深刻的问题来解决

1
2
/usr/bin/ld : cannot  find  -lssl
/usr/bin/ld : cannot  find  -lcrypto

发生这个问题是因为少了 libssl.so 和libcrypto.so 这两个动态链接库.这个问题很好解决只要安装缺少的库就ok了.(openssl包含了这两个库)

1
root@luffy-virtual-machine:~ /Desktop/gsoap-2 .8 # apt-get install openssl

但是问题没有解决依然是找不到链接库.进入usr/lib 找寻这两个库

1
2
3
4
root@luffy-virtual-machine: /usr/lib # find -name "*ssl.so*"
. /i386-linux-gnu/libssl .so.1.0.0
. /i386-linux-gnu/libgnutls-openssl .so.26
. /i386-linux-gnu/libgnutls-openssl .so.26.16.14

没有发现 libssl.so 但是发现一些相似的库.猜想后面的是数字的版本号因此直接建立软连接来使用这个./i386-linux-gnu/libssl.so.1.0.0

1
root@luffy-virtual-machine: /usr/lib # ln -s ./i386-linux-gnu/libssl.so.1.0.0 libssl.so

虽然不知道具体原因不过问题解决了, libcrypto 也是使用相同的手法解决了这个问题.

##################################################################

重头戏开始了

gsoap 的使用

接下来是如何使用gsoap 进行编程了.主要是wsdl2h,和soapcpp2这两个命令的使用和最后文件的编译

为了简化这一过程. 下面提供了一个高度白痴化的Makefile



server := myServer
client := myClient
                                                            
#your gsoap install directory
GSOAP_DIR= /root/zai/gsoap-2 .8
                                                            
#compiler
CORSS_COMPILER = 
G++ :=$(CORSS_COMPILER)g++
                                                            
#flags
LIBS:=  -lpthread -lm
INCLS := -I ./
CFLAGS := -g -O2 -Wall -Wno-deprecated-declarations
                                                            
#files
WSDL_FILES := temp.h
GSOAP_FILES := soapClient.cpp soapServer.cpp soapC.cpp soapH.h soapStub.h
CP_FILES := stdsoap2.h stdsoap2.cpp
                                                            
COM_SOURCES := soapC.cpp  stdsoap2.cpp
COM_OBJS := $(COM_SOURCES:.cpp=.o)
SERVER_SOURCES := $(server).cpp soapServer.cpp
SERVER_OBJS := $(SERVER_SOURCES:.cpp=.o)
CLIENT_SOURCES := $(client).cpp soapClient.cpp
CLIENT_OBJS := $(CLIENT_SOURCES:.cpp=.o)
                                                            
TYPEMAP = $(wildcard *typemap.dat)
ifeq ( , $(TYPEMAP))
TYPEMAP = $(GSOAP_DIR) /gsoap/typemap .dat
endif
#MAKE
.PHONY: all   
all: wsdl gsoap  cp  $(client)  #$(server)
                                                            
$(server):$(SERVER_OBJS) $(COM_OBJS)
     $(G++) $(INCLS) $(CFLAGS) -o $@ $^ $(LIBS)
$(client):$(CLIENT_OBJS) $(COM_OBJS)
     $(G++) $(INCLS) $(CFLAGS) -o $@ $^ $(LIBS)
$(COM_OBJS) $(CLIENT_OBJS) $(SERVER_OBJS):%.o:%.cpp
     $(G++) $(INCLS) $(CFLAGS) -o $@ -c $^  
                                                            
wsdl:
ifneq ($(WSDL_FILES), $(wildcard $(WSDL_FILES)))
     $(GSOAP_DIR) /gsoap/wsdl2h  -P -t $(TYPEMAP) $(wildcard *.wsdl) -o $(WSDL_FILES)
endif
gsoap:
ifneq ($(GSOAP_FILES), $(wildcard $(GSOAP_FILES)))
     $(GSOAP_DIR) /gsoap/src/soapcpp2  -x -L -T -I $(GSOAP_DIR) /gsoap/import :$(GSOAP_DIR) /gsoap  $(WSDL_FILES)
endif
cp :
ifneq ($(CP_FILES), $(wildcard $(CP_FILES)))
     @ cp  $(GSOAP_DIR) /gsoap/stdsoap2 .cpp $(GSOAP_DIR) /gsoap/stdsoap2 .h ./ - v
endif
                                                            
#clean
clean:
     @ rm  -rfv *.o *~ $(server) $(client)
deepClean:
     @ rm  -rfv *.o *~ *Proxy.h *Object.h $(server) $(client) *.nsmap soapTester.cpp $(CP_FILES) $(GSOAP_FILES) $(WSDL_FILES)


这是一个灰常自动化的makefile,听我说你要做的事就是.

1.) 新建一个目录,把这个makefile 复制下来放这个目录下,把你的 *.wsdl 文件(可以有多个wsdl文件)也放到这个目录下

2.) 修改makefile中的gsoap安装包路径也就是上面第5行的地方.(也就是刚刚解压得到的那个gsoap-2.8的路径了).

3.) 新建一个 myClient.cpp文件,(这个文件的写法请参考下文)

4.) 输入 make


一般情况下一切都会豁然开朗的, myClient是最后生成的可执行程序.

make clean 是删除可执行程序和一些.o文件.使用make clean 之后再进行 make 并不会从头执行 wsdl2h 和 soapcpp2h.

如果你想从头生成一些soap文件,例如你想更换 wsdl 文件的时候,请使用 make deepClean


##################################################################

实例

下面我使用上述方法来实现 gsoap 读写 QQ 在线状态的程序.

首先我们要获取 QQ 在线状态的 wsdl 文件.在http://webservice.webxml.com.cn/webservices/qqOnlineWebService.asmx?wsdl可以获取到.

建议大家把这个页面保存下来,而不要直接复制进虚拟机,因为编码的问题.另存为qqOnlineWebService.wsdl 


1.)接下来我们先建立一个(gsoap)目录并把makefile和 wsdl文件放入这个目录.

复制(Makefile)的时候请注意,命令开头的[tab] 全部变成了空格,我们要把空格重新改成[tab]

查看下目录文件

1
root@luffy-virtual-machine:~ /Desktop/gsoap # ls Makefile  qqOnlineWebService.xml

2.)修改下makefile中的安装包路径.

我的gsoap安装包是放在桌面的所以修改成

1
#your gsoap install directory GSOAP_DIR=/root/Desktop/gsoap-2.8

3.)兴建myClient.cpp文件

这个文件里要包含我们的main函数.还要include两个文件.一个是soapStub.h 另一个是 *.nsmap 文件 (就算工程里生成了许多的*.nsmap文件也只需要包含其中一个)

针对qqOnlineWebService.wsdl 我们来写一个myClient.cpp的范例


#include "soapStub.h" 
#include "qqOnlineWebServiceSoap.nsmap"     
int  main() 
{     
     struct  soap soap;     
     struct  _ns1__qqCheckOnline request;     
     struct  _ns1__qqCheckOnlineResponse response;       
     soap_init(&soap);     
     std::string num( "1028667350" );       
     request.qqCode = #     
     if (soap_call___ns1__qqCheckOnline(&soap, NULL, NULL, &request, &response) == SOAP_OK){         
         printf ( "QQ: %s state is %s\n" ,request.qqCode->data(), response.qqCheckOnlineResult->data());     
     } else {             
         printf ( "Error\n" );     
     }       
     soap_destroy(&soap);     
     soap_end(&soap);     
     soap_done(&soap);     
     return  0; 
}

再查看下目录文件

1
root@luffy-virtual-machine:~ /Desktop/gsoap # ls Makefile  myClient.cpp  qqOnlineWebService.wsdl

这个时候我们需要的三个文件都有了.

4.)最后就可以输入make 了.


编译正常就恭喜你了,成功了

最后执行下myClient

1
root@luffy-virtual-machine:~ /Desktop/gsoap # ./myClient  QQ: 1028667350 state is Y

得到了 QQ: 1028667350 state is Y ,Y是在线的意思....

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值