gSOAP使用的網路模型

2021-07-11 15:37:39 字數 2051 閱讀 6093

linux平台下gsoap使用了傳統的select模型,windows下gsoap使用了poll模型,本文主要介紹linux平台下的select模型。

int select(int maxfdp1,fd_set*readset,fd_set *writeset,fd_set *exceptset,const struct timeval *timeout)

返回值:就緒描述符的數目,超時返回0,出錯返回-1

(1)第乙個引數maxfdp1指定待測試的描述字個數,它的值是待測試的最大描述字加1(因此把該引數命名為maxfdp1),描述字0、1、2...maxfdp1-1均將被測試。

因為檔案描述符是從0開始的。

(2)中間的三個引數readset、writeset和exceptset指定我們要讓核心測試讀、寫和異常條件的描述字。如果對某乙個的條件不感興趣,就可以把它設為空指標。struct fd_set可以理解為乙個集合,這個集合中存放的是檔案描述符,可通過以下四個巨集進行設定:

void fd_zero(fd_set*fdset);           //清空集合

void fd_set(int fd, fd_set *fdset);   //將乙個給定的檔案描述符加入集合之中

void fd_clr(int fd, fd_set *fdset);   //將乙個給定的檔案描述符從集合中刪除

int fd_isset(int fd, fd_set *fdset);   // 檢查集合中指定的檔案描述符是否可以讀寫 

(3)timeout告知核心等待所指定描述字中的任何乙個就緒可花多少時間。其timeval結構用於指定這段時間的秒數和微秒數。

struct timeval{

long tv_sec;   //seconds

long tv_usec;  //microseconds

這個引數有三種可能:

(1)永遠等待下去:僅在有乙個描述字準備好i/o時才返回。為此,把該引數設定為空指標null。

(3)根本不等待:檢查描述字後立即返回,這稱為輪詢。為此,該引數必須指向乙個timeval結構,而且其中的定時器值必須為0。

1〉每次呼叫select,都需要把fd集合從使用者態拷貝到核心態,這個開銷在fd很多時會很大

2〉同時每次呼叫select都需要在核心遍歷傳遞進來的所有fd,這個開銷在fd很多時也很大

3〉select支援的檔案描述符數量太小了,預設是1024

1.主函式for迴圈,呼叫soap_accept函式,返回得到client的socket

2.soap_accept內部呼叫tcp_select

tcp_select(struct soap *soap, soap_socketsk, int flags, int timeout){

r =select((int)sk + 1, rfd, sfd, efd, &tv);//當server接受到client的連線,該函式返回

if(r > 0)

{ r= 0;

if ((flags & soap_tcp_select_rcv) && fd_isset(sk, rfd))//如果是讀,將r置位為讀,返回

r |= soap_tcp_select_rcv;

if ((flags & soap_tcp_select_snd) && fd_isset(sk, sfd))

r |= soap_tcp_select_snd;

if ((flags & soap_tcp_select_err) && fd_isset(sk, efd))

r |= soap_tcp_select_err;

3.soap_accept內部接著呼叫soap->faccept,然後返回soap->socket

soap->socket = soap->faccept(soap, soap->master, (structsockaddr*)&soap->peer, &n);

該函式為函式指標,函式原型為

tcp_accept(struct soap*, soap_socket,struct sockaddr*, int*) {

fd = accept(s, a, (soap_socklen_t*)n);

gSOAP 使用WebServer心得

關於正常怎麼使用gsoap的話,下面那篇部落格已經講得非常詳細,我就不再贅述了 問題1 如果你使用的gsoap是1.2版本,而webserver伺服器是1.0版本,wcf server 和 gsoap產生的 client端之間通訊的soap message format不匹配。當客戶端發起請求時,s...

gsoap常見使用方法

網上有很多gsoap客戶端或者伺服器端最常見的例子,在這裡我就不多講了,主要講解一下不太常見的一些內容,自己琢磨出來的一些東西,供給大家參考一下。通過wsdl2h h可以檢視wsdl2h命令的一些option,而最常用的一些有如下幾個 s 命令意味著產生的標頭檔案不要使用stl t 後面接typem...

gsoap常見使用方法

網上有很多gsoap客戶端或者伺服器端最常見的例子,在這裡我就不多講了,主要講解一下不太常見的一些內容,自己琢磨出來的一些東西,供給大家參考一下。通過wsdl2h h可以檢視wsdl2h命令的一些option,而最常用的一些有如下幾個 s 命令意味著產生的標頭檔案不要使用stl t 後面接typem...