最近,刚接触到gsoap。对于我这个对web编程一无所知的人来说, 太陌生了,与之前所做领域跨度有点大。首先,在官网上下载了win32二进制安装包,尝试着完成一个简单地demo,在网上搜索了一下,关于vc下用gSOAP 编写webServer的技术文档大部分来至一个出处。而这篇文档中,有有些重要的细节没有描述清楚。
进入正题:
编程环境 window7 + vs2008 + soapcpp-win32-2.1.6
1.以服务器提供两数相加的功能为例,编写头文件add.h
2.找到gsoap/bin目录下的soapcpp2.exe,在cmd执行中soapcpp2.exe add.h,成功的话会生成如下文件add.namap,soapH.h,soapC.cpp,soapClient.cpp,soapServer.cpp
执行soapcpp2.exe -h可查看其具体运行参数。
3.在vs2008下新建win32控制台工程,将刚才生成的所有文件和gsoap_win32目录下stdsoap2.cpp、stdsoap2.h文件加入工程,其中,文件add.nsmap文件改为后缀为.h的文件(这里为nsmap.h),不然add.nsmap会产生如下的编译错误:
non-aggregates cannot be initialized with initializer list 1> 'Namespace' : Types with user defined constructors are not aggregate
。并引入wsock32.lib库,并新建一个main.cpp文件,编写代码如下:
#include "add.h"
#include "stdsoap2.h"
#include "nsmap.h" //不添加的话,会导致gsoap unresolved external symbol _namespaces的链接错误
#pragma comment(lib,"wsock32.lib")
int main(int argc, char* argv[])
{
int m, s; /* master and slave sockets */
struct soap add_soap;
soap_init(&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, stderr);
exit(-1);
}
fprintf(stderr, "Socket connection successful: slave socket = %d\n", s);
soap_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;
}
编译运行ok,启动123端口,在浏览器中输入localhost:123访问server,显示如下的xml页面
以上就是关于gSOAP 编写webServer的过程,目前只是硬生生的完成一个简单demo,其中的原理还是不太懂。