1、定义头文件内容:
for example(Test.h):
struct ServiceData
{
char* sz ;//required
int iSize ;//required
};
int service_GetSpecificServiceState(struct ServiceData* servicestate,struct ServiceData* servicestateResponce);
2、使用soapcpp2.exe 生成gsoap相关的文件
使用cmd命令:soapcpp2.exe Test.h
soapcpp2.exe 相关的参数选项可查询资料。
生成文件列表:soap.nsmap、soapC.cpp、soapClient.cpp、soapClientLib.cpp、soapH.h、soapServer.cpp、soapServerLib.cpp、soapStub.h。
同时需要到gsoap路径下(如:gsoap-2.8.34\gsoap)获取stdsoap2.cpp、stdsoap2.h两个必须文件。
3、 服务端使用的文件为:soap.nsmap、soapC.cpp、soapH.h、soapServer.cpp、soapStub.h、stdsoap2.cpp。
将这几个文件引入到工程里,设置cpp文件不需预编译头,同时将头文件包含进来。
对于soap.nsmap也需要包含进来, 如下:
#include "soap.nsmap"
注意防止被多次编译。
4、当编译问题成功后,后面会提示链接失败,这里主要还有一个函数未实现,即我们在头文件中定义的函数接口。我们需要在一个源文件中实现它们。
SOAP_FMAC5 int SOAP_FMAC6 service_GetSpecificServiceState(struct soap* soap, struct ServiceData *servicestate, struct ServiceData *servicestateResponce)
{
//这里编写处理代码,其中servicestate为客户端传入的参数,我们只需要使用这里的参数编写逻辑代码
...
//处理完后我们需要将一些数据信息返回给客户端,此时通过servicestateResponce,注意我们定义的结构体ServiceData里包含char* 指针,我们需要对其申请内存 ,使用soap_malloc接口即可,内存释放栈调用上层会主动释放,不用管。
//同时需要返回错误码 正常反馈 SOAP_OK 等等
}
5、实现接口后编译链接即可成功,然后需要做的就是开启服务,在main函数或其他线程中开启服务。
#define GsoapServerPort 8005
void GsoapServiceThread(LPVOID lpParam)
{
char szFilepath[256] = { 0 };
GetModuleFileName(nullptr, szFilepath, 256);
(strrchr(szFilepath, '.'))[1] = 0;
strcat_s(szFilepath, "ini");
char szIp[64] = { 0 };
GetPrivateProfileString("ServiceManager", "gsoapIp", "", szIp, 64, szFilepath);
struct soap *soapServer = soap_new();
int sock_master = soap_bind(soapServer, (strlen(szIp) == 0) ? nullptr : szIp, GsoapServerPort, 100);
if (sock_master < 0)
{
soap_print_fault(soapServer, stderr);
return ;
}
PRJ_INFO("gsoap service is running!");
while (!g_bGsoapExit)
{
int sock_client = soap_accept(soapServer);
if (sock_client < 0)
{
soap_print_fault(soapServer, stderr);
continue;
}
soap_serve(soapServer);
soap_end(soapServer);
}
soap_done(soapServer);
soap_free(soapServer);
return ;
}
上面是一个例子,ip从ini配置文件中读取;定义端口宏;创建soap对象;绑定地址和端口,当ip为空时输入nullptr,代表本机地址;然后接收客户端连接并处理客户端请求,循环如此。
6、生成exe文件后启动服务,在网页可以测试连接是否成功
在网页地址输入http://192.168.1.12:8005:
<?xml version="1.0" encoding="UTF-8"?>
-<SOAP-ENV:Fault xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<faultcode>message</faultcode>
<faultstring>HTTP GET method not implemented</faultstring>
</SOAP-ENV:Fault>
打印如上字符表示服务已开启。