gSOAP 原始碼分析 一

2021-06-17 20:19:12 字數 2962 閱讀 5049

gsoap 原始碼分析(一)

邵盛松 2012-5-22

一 soap

訊息結構

soap訊息包括以下元素

必需的 envelope 

元素,可把此 

xml 

文件標識為一條 

soap 

訊息,xml檔案的頂層元素,代表該檔案為

soap

訊息可選的 header 

元素,包含頭部資訊

必需的 body 

元素,包含所有的呼叫和響應資訊

可選的 fault 

元素,提供有關在處理此訊息所發生錯誤的資訊

可選的attachment

,主要用於傳遞附件,擴充套件的

soap訊息

envelope是

soap

訊息中的根節點,是

soap

訊息中必需的部分;

header

是soap

訊息中可選部分,如果

soap

訊息中含有它,那麼它一定要是

soap:envelope>

中的第乙個元素節點;

body

是soap

中必需部分,如果

soap

訊息中沒

header

,那麼body

必須是soap

中第乙個元素節點。

在預設生成的**中關於header 

元素定義

/* soap header: */

struct soap_env__header

;下圖為soap

訊息的結構

fault結構

供識別故障的**

這裡的錯誤是為人設定的,讓人讀懂,而不是為程式處理設定的。

有關是誰引發故障的資訊

body元素中的內容不能被成功地處理的時候,它就出現了。

**中fault結構體如下

struct soap_env__fault

;fault是

body

的乙個子元素主要用於用於報告錯誤。

soap命名空間

soap_nmac struct namespace namespaces =,,

,,,};

這裡的url並不是指向檔案,而只是乙個名字。如果乙個soap

應用程式接收了乙個訊息,而該訊息的

soap envelope

元素使用和上述不同的命名空間,則該應用程式就將其視為版本錯誤並忽略該訊息。

二 gsoap keep-alive和超時管理

gsoap是繫結http協議來對xml資料進行傳輸,乙個soap請求實際上就是乙個http post請求。

訊息從傳送方到接受方方是單向傳送,即以請求/應答的方式實現的。這也就是為什麼生成的xml檔案都是req,res成對出現的

gsoap執行環境例項是乙個struct soap型別的變數,struct soap_std_api soap

。gsoap支援http keep-alive,生成**中預設沒有使用keep-alive

calcservice_init(soap_io_default, soap_io_default);

如果引數更改soap_io_keepalive將使用keep-alive,預設最大連線100

以下**在soap結構體中

short tcp_keep_alive; /* enable so_keepalive */

unsigned int tcp_keep_idle;  /* set tcp_keepidle */

unsigned int tcp_keep_intvl;  /* set tcp_keepintvl */

unsigned int tcp_keep_cnt;  /* set tcp_keepcnt */

unsigned int max_keep_alive;  /* maximum keep-alive session (default=100) */

tcp_keepidle  空閒多久開始傳送keepalive包

tcp_keepcnt 總共傳送多少個

tcp_keepintvl 每兩個keepalive包的傳送時間間隔

這種非阻塞管理需要設定超時時間

接收超時時間

傳送超時時間

連線超時時間

接受請求超時時間

**如下,這也是soap結構體的一部分

int recv_timeout;/* when > 0, gives socket recv timeout in seconds, 

int send_timeout;/* when > 0, gives socket send timeout in seconds, 

int connect_timeout;/* when > 0, gives socket connect() timeout in seconds, 

int accept_timeout;/* when > 0, gives socket accept() timeout in seconds, 

正值以秒為單位。負值以微秒為單位。

三 提高速度技巧

1 通過更改在stdsoap2.h檔案中soap_buflen巨集,增加快取大小

2 如果客戶端需要多次連線相同的伺服器,那麼客戶端使用http keep-alive。服務端也要支援http keep-alive,這樣能夠最大的增強服務端和客戶端的效能。

3 使用http分塊傳輸

4 不要使用gzip壓縮

gSOAP 原始碼分析 三

gsoap 原始碼分析 三 2012 5 25 flyfish 一 http請求方法 get 請求獲取 request uri 所標識的資源 post 在 request uri 所標識的資源後附加新的資料 head 請求獲取由 request uri 所標識的資源的響應訊息報頭 put 請求伺服器...

gSOAP 原始碼分析 四

gsoap 原始碼分析 四 2012 6 2 邵盛松 前言本文主要說明gsoap中對client的認證分析 gsoap中包含了http基本認證,ntlm認證等,還可以自定義soap heard實現認證等 一 http基本認證 client在向server傳送請求時提供以使用者名稱和口令形式的憑證 g...

Mangos原始碼分析 一)

mangos 原始碼分析 realmd 登陸伺服器 realmd 主程式 launch the realm server int main int argc,char argv h.add authlistensocket 進行一些引數設定 while stopevent 伺服器主迴圈 return...