惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

P
Privacy & Cybersecurity Law Blog
Vercel News
Vercel News
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
N
Netflix TechBlog - Medium
罗磊的独立博客
F
Fortinet All Blogs
T
Threatpost
Y
Y Combinator Blog
博客园_首页
美团技术团队
Security Latest
Security Latest
博客园 - 三生石上(FineUI控件)
T
Tailwind CSS Blog
V
V2EX - 技术
The Cloudflare Blog
L
LINUX DO - 热门话题
博客园 - 司徒正美
Jina AI
Jina AI
P
Proofpoint News Feed
宝玉的分享
宝玉的分享
C
CXSECURITY Database RSS Feed - CXSecurity.com
C
Cybersecurity and Infrastructure Security Agency CISA
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
WordPress大学
WordPress大学
The Hacker News
The Hacker News
P
Privacy International News Feed
T
The Exploit Database - CXSecurity.com
Scott Helme
Scott Helme
有赞技术团队
有赞技术团队
V
V2EX
Stack Overflow Blog
Stack Overflow Blog
M
MIT News - Artificial intelligence
Latest news
Latest news
NISL@THU
NISL@THU
Google DeepMind News
Google DeepMind News
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
C
Cisco Blogs
雷峰网
雷峰网
Application and Cybersecurity Blog
Application and Cybersecurity Blog
B
Blog RSS Feed
W
WeLiveSecurity
D
DataBreaches.Net
G
Google Developers Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
G
GRAHAM CLULEY
Spread Privacy
Spread Privacy
Know Your Adversary
Know Your Adversary
TaoSecurity Blog
TaoSecurity Blog
S
Securelist
Help Net Security
Help Net Security

博客园 - Jaypei

archlinux中启用sshd [转] AT89C52资料 VirtualBox中安装PuppyLinux4 [转]比较全的Vim 中的正则表达式 luacurl的一个获得html的函数 [转]使用Mac OS X系统必须了解的10条命令 [原]Qt4.5中Plugins使用方法 用nuSOAP传递对象数组的问题终于解决 粗心导致的gsoap一个错误 rdesktop中剪切板共享 [转]在Windows XP下用GCC 4.3.2编译Qt 4.4.3实战 Ubuntu下安装Postgresql 8.3 [原创]关于python的Singleton [转]如何讀取文字檔? (C/C++) (STL) 简单的python读写windows剪切板 - Jaypei 关于SOAPpy传递对象参数调用WebService的问题总结 - Jaypei LinkedServer的用法 解决Smarty中trancate使用UTF8时中文乱码问题 关于wxPython中多线程修改主界面 - Jaypei
MinGW环境使用gSOAP
Jaypei · 2009-04-01 · via 博客园 - Jaypei

2009-04-01 11:47  Jaypei  阅读(1267)  评论()    收藏  举报

环境

WindowsXP SP3,MinGW 5.1.4,Cygwin,CMake 2.6(可有可无)

编译

首先,下载gsoap:http://sourceforge.net/project/showfiles.php?group_id=52781

解压缩后执行

cd /libpath/
./configure --enable-samples=no

做如下修改:

/* Portability: define SOAP_SOCKLEN_T */
#if defined(_AIX)
if defined(_AIX43)
#  define SOAP_SOCKLEN_T socklen_t
else
#  define SOAP_SOCKLEN_T 
int
# endif
#elif defined(SOCKLEN_T)
# define SOAP_SOCKLEN_T SOCKLEN_T
#elif defined(__socklen_t_defined) || defined(_SOCKLEN_T) || defined(CYGWIN) || defined(FREEBSD) || defined(__FreeBSD__) || defined(__QNX__) || defined(QNX) || defined(OS390)
# define SOAP_SOCKLEN_T socklen_t
#elif defined(IRIX) || defined(WIN32) || defined(__APPLE__) || defined(HP_UX) || defined(SUN_OS) || defined(OPENSERVER) || defined(TRU64) || defined(VXWORKS)
# define SOAP_SOCKLEN_T 
int
#else
# define SOAP_SOCKLEN_T size_t
#endif// 修改为

/* Portability: define SOAP_SOCKLEN_T */
#if defined(_AIX)
if defined(_AIX43)
#  define SOAP_SOCKLEN_T socklen_t
else
#  define SOAP_SOCKLEN_T 
int
# endif
#elif defined(SOCKLEN_T)
# define SOAP_SOCKLEN_T SOCKLEN_T
#elif defined(__socklen_t_defined) || defined(_SOCKLEN_T) || defined(CYGWIN) || defined(FREEBSD) || defined(__FreeBSD__) || defined(__QNX__) || defined(QNX) || defined(OS390)
# define SOAP_SOCKLEN_T 
int
#elif defined(IRIX) || defined(WIN32) || defined(__APPLE__) || defined(HP_UX) || defined(SUN_OS) || defined(OPENSERVER) || defined(TRU64) || defined(VXWORKS)
# define SOAP_SOCKLEN_T 
int
#else
# define SOAP_SOCKLEN_T size_t
#endif

因为在编译的过程中发现make一直创建快捷方式,都指向stdsoap2.cpp和stdsoap2.c两个文件,而在make的过程中对快捷方式又总提示not found,于是这一步可以这么做:

cd /libpath/gsoap
cp stdsoap2.cpp stdsoap2_cpp.cpp
cp stdsoap2.c stdsoap2_ck.c
cp stdsoap2.cpp stdsoap2_ck_cpp.cpp
cp stdsoap2.c stdsoap2_ssl.c
cp stdsoap2.cpp stdsoap2_ssl_cpp.cpp

然后执行

cd /libpath
make

结果是报错的,提示找不到yacc。但是这个时候已经生成了所需要的库,于是我就没继续往下编译。

使用

使用就很简单了,网上的相关文章很多,简单用PHP的nuSOAP写一个服务端gSOAP做客户端测试一下。

PHP代码如下:

<?php 
require_once 'nusoap/nusoap.php';function hello() {
    
return '中文?';
}
function test1($str1, $str2) {
    
return 'S1:'.$str1.',S2:'.$str2;
}
$soap = new soap_server();
$soap->soap_defencoding = 'UTF-8';
$soap->decode_utf8 = false

$soap->configureWSDL('test1');
$soap->register('hello', 
    
array(), 
    
array("return"=>"xsd:string"));
$soap->register('test1', 
    
array("str1"=>'xsd:string', "str2"=>"xsd:string"),
    
array("result"=>"xsd:string"));
$soap->service($HTTP_RAW_POST_DATA);

把gsoap下的bin设置环境变量,然后执行:

wsdl2h -o hello.h http://jaypei.cnblogs.com/.../nusoap_test1.php?wsdl
soapcpp2 -IX:\...\gsoap\import -C -i hello.h

可以把它放到一个单独目录中然后写一个批处理去做。

main.cc如下:

#include <iostream>
#include 
<string>
#include 
"soaptest1BindingProxy.h"
#include 
"test1Binding.nsmap"
#include 
"stdsoap2.h"using namespace std;int main(int argc, char** argv) 
{

    test1BindingProxy proxy(SOAP_C_UTFSTRING);
    
string result;
    
if (proxy.hello(result) == SOAP_OK) {
        cout 
<< result << endl;
    }

    
return 0;
}

一定要加SOAP_C_UTFSTRING,说明使用UTF8.

假设目录service_header为批处理的目录,执行后,主目录CmakeLists.txt如下:

SET(SRC_FILES main.cc)
INCLUDE_DIRECTORIES(
    
"service_header"
    
"X:\...\gsoap"
)
LINK_DIRECTORIES(
    
"service_header"
    
"X:\...\gsoap"
)
ADD_SUBDIRECTORY(
    
"service_header"
)
ADD_EXECUTABLE(main ${SRC_FILES})

TARGET_LINK_LIBRARIES(main 

"wservice_test1"
    
"gsoap++"
    
"wsock32.lib"
)

service_header/CmakeLists.txt内容如下:

SET(SRC_FILES 
    
"soaptest1BindingProxy.cpp"
    
"soapC.cpp"
)
ADD_LIBRARY(wservice_test1 STATIC ${SRC_FILES})

调试成功!

链接的时候记得要加上gsoap++库、wsock32.lib和webservice编译生成的库

---

以上就是我全部的测试过程,使用不当的地方,还请留言指正。