天天看点

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相关的文件

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也需要包含进来, 如下:

注意防止被多次编译。

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[] = {  };

    GetModuleFileName(nullptr, szFilepath, );

    (strrchr(szFilepath, '.'))[] = ;

    strcat_s(szFilepath, "ini");

    char szIp[] = {  };

    GetPrivateProfileString("ServiceManager", "gsoapIp", "", szIp, , szFilepath);

    struct soap *soapServer = soap_new();

    int sock_master = soap_bind(soapServer, (strlen(szIp) == ) ? nullptr : szIp, GsoapServerPort, );

    if (sock_master < )
    {
        soap_print_fault(soapServer, stderr);
        return ;
    }
    PRJ_INFO("gsoap service is running!");
    while (!g_bGsoapExit)
    {
        int sock_client = soap_accept(soapServer);

        if (sock_client < )
        {
            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>
           

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

继续阅读