1. 程式人生 > >Gsoap 服務端程式碼編寫

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>

列印如上字元表示服務已開啟。