?
下载地址:http://www.voidcn.com/tag/http://sourceforge.net/projects/gsoap2
官方网站:http://www.voidcn.com/tag/http://genivia.com/Products/gsoap/index.html
?
一、服务器端
1、首先编写 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、用gsoap/bin目录下的soapcpp2.exe程序,生成一些文件。
方法:用cmd执行soapcpp2.exe add.h。
soapcpp2.exe可以带参数执行,具体执行soapcpp2.exe -h查看。(示例:http://www.cppprog.com/2009/0723/138_2.html)
在这个目录下会自动生成许多将来有用的文件,如add.namap,soapH.h,soapC.cpp,soapClient.cpp,soapServer.cpp等文件。
?
3、新建一个win32控制台工程,加入wsock32.lib库,将刚才生成的那些文件添加到工程中。
然后编写addserver.cpp主程序:
- #include?"soapH.h"????????????//原文是#include?"addH.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);????????//原文这个是打开的。 ??
- 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,?"Socket?connection?successful:?slave?socket?=?%d/n",?s);??
- soap_serve(&add_soap);//该句说明该server的服务????????//原文是add_serve(&add_soap); ??
- soap_end(&add_soap);??
- }??
- }??
- return?0;??
- }??
- ??
- //server端的实现函数与add.h中声明的函数相同,但是多了一个当前的soap连接的参数 ??
- int?ns__add(struct?soap?*add_soap,?int?num1,?int?*sum)??
- {??
- *sum?=?num1?+?num2;??
- return?0;??
- }??
4、编译
编译这个程序,会提示错误,将gsoap_win32目录下stdsoap2.cpp,stdsoap2.h文件加入工程,重新编译如果还有错误,可能是你将add.h生成的文件添加入工程出错的原因。
实际上在编写server程序时,无须带Client的那些文件,还有带Lib的文件也无须添加到工程中。
调试成功之后,在cmd中执行gsoap.exe文件,并设定第一个参数为4567。在IE中输入http://localhost:4567,如果显示xml页面,说明程序已经启动。
二、客户端
1、? 客户端程序代码如下:
- #include?<stdio.h> ??
- #include?<stdlib.h> ??
- #include?"stdsoap2.h" ??
- #include?"soapH.h" ??
- #include?"add.nsmap" ??
- ??
- int?add(const?char*?server,?int?*sum);??
- ??
- int?main(int?argc,?char?**argv)??
- {??
- ?????int?result?=?-1;??
- ?????char*?server="http://localhost:4567/";??
- ?????int?num1?=?1;??
- ?????int?num2?=?2;??
- ?????int?sum?=?0;??
- ?????result?=?add(server,?num1,?num2,?&sum);??
- ?????if?(result?!=?0)??
- ?????{??
- ?????????printf("soap?err,errcode?=?%d/n",?result);??
- ?????}??
- ?????else??
- ?????{??
- ?????????printf("%d+%d=%d/n",?sum?);??
- ?????}??
- ?????return?0;??
- }??
- ??
- int?add(const?char*?server,?int?*sum)??
- {??
- ?????struct?soap?add_soap;??
- ?????int?result?=?0;??
- ?????soap_init(&add_soap);??
- ??
- ?????soap_call_ns__add(?&add_soap,?server,?"",?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;??
- }??
(输出:1+2=3)
2、客户端程序既可以新建一个新的win32控制台程序,将刚才生成的nsmap,soapClient.h等文件加入工程,编译既可。