gsoap 原始碼分析(三)
2012-5-25 flyfish
一 http請求方法
get 請求獲取
request-uri
所標識的資源
post 在
request-uri
所標識的資源後附加新的資料
head 請求獲取由
request-uri
所標識的資源的響應訊息報頭
put 請求伺服器儲存乙個資源,並用
request-uri
作為其標識
delete 請求伺服器刪除
request-uri
所標識的資源
trace 請求伺服器回送收到的請求資訊,主要用於測試或診斷
connect 保留將來使用
options 請求查詢伺服器的效能,或者查詢與資源相關的選項和需求
gsoap對應的函式如下
二 http的處理
三 請求與應答的訊息說明
下面是截獲gsoap的資料報
1)gsoap客戶端的請求,請求的是add 引數是 1和2,即讓服務端計算1+2=?
request訊息說明
post / http/1.1 表示 post方法傳輸資料和 http協議的版本號
host: localhost:8080表示 服務端的主機 名稱和埠號
user-agent: gsoap/2.8 表示客戶端的資訊
請求內容和自動生成的calc.add.req.xml檔案除了引數變了,其他內容一樣
2)gsoap服務端的應答
3response訊息說明
協議版本號: http/1.1
狀態碼:200
狀態訊息:ok
server: gsoap/2.8 表示gsoap服務端的軟體資訊
content-type: text/xml; charset=utf-8
gsoap服務端響應的物件的型別和字符集
connection: close 表示乙個客戶端的request完成,客戶端與服務端的
tcp連線已關閉
應答內容和calc.add.res.xml
檔案中的內容除了結果值以外,其他內容一樣
四 gsoap的使用的網路模型
gsoap使用了傳統的select模型
tcp_select(struct soap *soap, soap_socket s, int flags, int timeout)
select(
__in int nfds,
__inout_opt fd_set far * readfds,
__inout_opt fd_set far * writefds,
__inout_opt fd_set far * exceptfds,
__in_opt const
struct timeval far * timeout
第乙個引數會被系統忽略的。
第二個引數是用來檢查套接字上是否有資料可讀
第三個引數用來檢查資料是否可以發出。
最後乙個是檢查是否有帶外資料可讀取
windows下最多支援的併發連線數為64,該連線數由巨集fd_setsize控制的,該值預設是64
gsoap重新定義了該巨集為1024
#ifndef fd_setsize
# define fd_setsize (1024)
#endif
select工作流程
1 用fd_zero
巨集來初始化感興趣的
fd_set
,用fd_set
巨集來將套接字控制代碼分配給相應的
fd_set。
gsoap中感興趣的
fd_set
一句fd_zero 接著一句fd_set
if (flags & soap_tcp_select_rcv)
{ rfd = &fd[0];
fd_zero(rfd);
fd_set(s, rfd);
if (flags & soap_tcp_select_snd)
{ sfd = &fd[1];
fd_zero(sfd);
fd_set(s, sfd);
if (flags & soap_tcp_select_err)
{ efd = &fd[2];
fd_zero(efd);
fd_set(s, efd);
soap_tcp_select_err這個是外帶資料,用來表示錯誤
2呼叫select函式,用fd_isset對套接字控制代碼進行檢查
r = select((int)s + 1, rfd, sfd, efd, &tv);
if (r > 0)
{ r = 0;
if ((flags & soap_tcp_select_rcv) && fd_isset(s, rfd))
r |= soap_tcp_select_rcv;
if ((flags & soap_tcp_select_snd) && fd_isset(s, sfd))
r |= soap_tcp_select_snd;
if ((flags & soap_tcp_select_err) && fd_isset(s, efd))
r |= soap_tcp_select_err;
3 剩下的是accept,recv,closesocket.
tcp_accept(struct soap *soap, soap_socket s, struct sockaddr *a, int *n)
fd = accept(s, a, (soap_socklen_t*)n);
frecv(struct soap *soap, char *s, size_t n)
recv(soap->socket, soap->tmpbuf, 1, msg_peek) < 0))
gSOAP 原始碼分析 四
gsoap 原始碼分析 四 2012 6 2 邵盛松 前言本文主要說明gsoap中對client的認證分析 gsoap中包含了http基本認證,ntlm認證等,還可以自定義soap heard實現認證等 一 http基本認證 client在向server傳送請求時提供以使用者名稱和口令形式的憑證 g...
gSOAP 原始碼分析 一
gsoap 原始碼分析 一 邵盛松 2012 5 22 一 soap 訊息結構 soap訊息包括以下元素 必需的 envelope 元素,可把此 xml 文件標識為一條 soap 訊息,xml檔案的頂層元素,代表該檔案為 soap 訊息可選的 header 元素,包含頭部資訊 必需的 body 元素...
redux原始碼分析(三) 原始碼部分
下面是每個部分的一些解讀 createstore apicreatestore reducer,initialstate enhancer 曾經非常好奇這個函式的第二個引數到底是initialstate還是enhancer,因為見過兩種寫法都有的,以為是版本問題。看了原始碼才發現,都可以的。如果你不...