gSOAP 原始碼分析 三

2021-06-06 18:55:17 字數 4790 閱讀 7352

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,因為見過兩種寫法都有的,以為是版本問題。看了原始碼才發現,都可以的。如果你不...