1.gsoap工具下载地址;
http://sourceforge.net/projects/gsoap2/files/
2.新建win32控制台工程webservice,新建webservice/interface目录;
3.新建接口头文件interface/interface.h,根据需要声明接口函数;
//gsoap ns service name: interface
//gsoap ns service namespace: http://localhost/interface.wsdl
//gsoap ns service location: http://localhost
//gsoap ns service executable: interface.cgi
//gsoap ns service encoding: encoded
//gsoap ns schema namespace: urn:interface
int ns__add(int nNumber1, int nNumber2, int* nOutputNumber);
4.命令行进入webservice/interface目录,执行bin/soapcpp2.exe interface.h,生成以下文件;
5.将stdsoap2.h、stdsoap2.cpp拷贝到webservice目录下,并引入工程(预编译头选项->”否”);
6.新增Realization.h、Realization.cpp用以声明和实现interface.h中的函数,放在webservice目录下;
#pragma once
// 说明:server端的实现函数与interface.h中声明的函数相同,但是多了一个当前的soap连接的参数
int ns__add(struct soap *stSoap, int nNumber1, int nNumber2, int *nOutputNumber);
#include "Realization.h"
int ns__add(struct soap *stSoap, int nNumber1, int nNumber2, int *nOutputNumber)
{
*nOutputNumber = nNumber1 + nNumber2;
return 0;
}
7.将interface/soapH.h、interface/soapStub.h、interface/soapC.cpp、interface/soapServer.cpp引入工程(预编译头选项->”否”);
8.新增webservice/stringEx.h,用以字符串转换;
#ifndef _STRINGEX_H #define _STRINGEX_H #include <stdlib.h> /* *********************************************************************** * 函数:THCAR2Char * 描述:将TCHAR* 转换为char* * 日期:-05-30 *********************************************************************** */ char* THCAR2char(TCHAR* tchStr) { int iLen = 2 * wcslen(tchStr); // CString,TCHAR汉字算一个字符,因此不用普通计算长度 char* chRtn = new char[iLen + 1]; wcstombs(chRtn, tchStr, iLen + 1); // 转换成功返回为非负值 return chRtn; } #endif
9.编写tmain主线程入口函数;
// webservice.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include "stringEx.h" #include "Realization.h" #include "interface/interface.h" #include "interface/interface.nsmap" int _tmain(int argc, _TCHAR* argv[]) { int nMasterSocket = INVALID_SOCKET; int nSlaveSocket = INVALID_SOCKET; struct soap stSoap; soap_init(&stSoap); if (argc < 2) { std::cout << "usage:" << argv[0] << "<server port>." << std::endl; return 0; } char *pszPort = THCAR2char(argv[1]); nMasterSocket = soap_bind(&stSoap, NULL, atoi(pszPort), 100); delete []pszPort; pszPort = NULL; if (nMasterSocket < 0) { soap_print_fault(&stSoap, stderr); return 0; } std::cout << "Socket connection successful.Master socket = " << nMasterSocket << std::endl; while (true) { nSlaveSocket = soap_accept(&stSoap); if (nSlaveSocket < 0) { soap_print_fault(&stSoap, stderr); return 0; } // 该句说明该server的服务 soap_serve(&stSoap); soap_end(&stSoap); } system("pause"); return 0; }
10.调试运行(带端口参数:如8101),在IE中输入http://localhost:8101,如果显示XML页面,说明程序已经启动。