Gsoap 服務端程式碼編寫
阿新 • • 發佈:2019-02-01
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>
列印如上字元表示服務已開啟。