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...