国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

gsoap中文文檔(5.gSoap2.x版與gSOAP 1.x版的不同)

2019-11-18 11:28:13
字體:
來源:轉載
供稿:網友

5. gSoap2.x版與gSOAP 1.x版的不同
 假如你是從1.x版升級到2.x版,請注重下面的內容。
 gSOAP2.0及之后的版本是在1.x版基礎上重寫的。gSOAP2.0之后的版本是線程安全的,但之前版本不是。gSOAP2.x版本中的主要文件已經重新命名,以便與1.x版區分。

gSOAP 1.X  gSOAP 2.X 
soapcpp  soapcpp2 
soapcpp.exe  soapcpp2.exe 
stdsoap.h  stdsoap2.h 
stdsoap.c  stdsoap2.c 
stdsoap.cpp  stdsoap2.cpp 
 
 從1.x版升級到2.x版并不需要進行大量的代碼重寫工作。所有2.x版相關的函數都定義在stdsoap2.c[pp]文件中,這個文件是由gSOAP編譯器自動生成的。所以,用1.x版開發的服務端或客戶端代碼需要進行修改以適應2.x版中函數的變化:在2.x版中,所有的gSOAP函數都增加了一個參數用來保存一個gSOAP運行環境實例。這個參數包括了文件描述,表,緩沖,標志位等,它在所有gSOAP函數中都是第一個參數。
 gSOAP運行環境實例是一個strUCt soap類型的變量。當客戶端程序訪問遠程方法前或當服務端程序能夠接收一個請求前,必須先將這個運行環境變量初始化。在2.x版中新增了3個函數來負責這些事情:
 函數                        解釋
 soap_init(struct soap *soap)         初始化環境變量(只需執行一次)
 struct soap *soap_new()            定義并初始化環境變量并返回一個該變量的指針
 struct soap *soap_copy(struct soap *soap)   定義一個環境變量并從已有的環境變量中拷貝環境信息
 
  環境變量定義好后就可以重復使用而不必再次初始化了。只有當線程獨占訪問時,我們才需要一個新的環境變量。例如,下面的代碼分配了一個用于多個遠程方法的環境變量:
 int main()
{
   struct soap soap;
   ...
   soap_init(&soap); // 初始化環境變量
   ...
   soap_call_ns__method1(&soap, ...); // 調用一個遠程方法
   ...
   soap_call_ns__method2(&soap, ...); // 調用另一個遠程方法
   ...
   soap_end(&soap); // 清除環境變量
   ...
}
 我們也可以像下面這樣定義環境變量:
 int main()
{
   struct soap *soap;
   ...
   soap = soap_new(); // 定義并初始化環境變量
   if (!soap) // 假如不能定義,退出
   ...
   soap_call_ns__method1(soap, ...); // 調用遠程函數
   ...
   soap_call_ns__method2(soap, ...); // 調用另一個遠程函數
   ...
   soap_end(soap); // 清除環境變量
   ...
   free(soap); // 釋放環境變量空間
}
 
 服務端代碼在調用soap_serve函數前,需要定義相關環境變量:

int main()
{
   struct soap soap;
   soap_init(&soap);
   soap_serve(&soap);

 或者像下面這樣:

int main()
{
   soap_serve(soap_new());

 soap_serve函數用來處理一個或多個(當答應HTTP keep-alive時,參見18.11節中的SOAP_IO_KEEPALIVE標志)請求。
 一個web服務可以用多線程技術來處理請求:
int main()
{
   struct soap soap1, soap2;
   pthread_t tid;
   ...
   soap_init(&soap1);
   if (soap_bind(&soap1, host, port, backlog) < 0) exit(1);
   if (soap_accept(&soap1) < 0) exit(1);
   pthread_create(&tid, NULL, (void*(*)(void*))soap_serve, (void*)&soap1);
   ...
   soap_init(&soap2);
   soap_call_ns__method(&soap2, ...); // 調用遠程方法
   ...
   soap_end(&soap2);
   ...
   pthread_join(tid, NULL); // 等待線程結束
   soap_end(&soap1); // 釋放環境變量



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 新安县| 泽库县| 扎兰屯市| 惠安县| 武山县| 铜山县| 张家港市| 镇巴县| 清水河县| 大关县| 邵武市| 湖南省| 绵阳市| 犍为县| 恩施市| 张家界市| 蕲春县| 团风县| 定远县| 密山市| 广水市| 安丘市| 青河县| 石泉县| 张家口市| 鄂尔多斯市| 中宁县| 威宁| 红原县| 渝中区| 高尔夫| 虹口区| 漯河市| 永兴县| 龙江县| 贵阳市| 柘城县| 增城市| 汶川县| 石屏县| 孝昌县|