Gsoap 服务端代码编写


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>

打印如上字符表示服务已开启。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值