分享
 
 
 

gsoap中文文档(5.gSoap2.x版与gSOAP 1.x版的不同)

王朝other·作者佚名  2006-04-14
窄屏简体版  字體: |||超大  

5. gSoap2.x版与gSOAP 1.x版的不同

如果你是从1.x版升级到2.x版,请注意下面的内容。

gSOAP2.0及之后的版本是在1.x版基础上重写的。gSOAP2.0之后的版本是线程安全的,但之前版本不是。gSOAP2.x版本中的主要文件已经重新命名,以便与1.x版区分。

gSOAP 1.X gSOAP 2.X

soapcpp soapcpp2

soapcpp.exe soapcpp2.exe

stdsoap.h stdsoap2.h

stdsoap.c stdsoap2.c

stdsoap.cpp stdsoap2.cpp

从1.x版升级到2.x版并不需要进行大量的代码重写工作。所有2.x版相关的函数都定义在stdsoap2.c[pp]文件中,这个文件是由gSOAP编译器自动生成的。所以,用1.x版开发的服务端或客户端代码需要进行修改以适应2.x版中函数的变化:在2.x版中,所有的gSOAP函数都增加了一个参数用来保存一个gSOAP运行环境实例。这个参数包括了文件描述,表,缓冲,标志位等,它在所有gSOAP函数中都是第一个参数。

gSOAP运行环境实例是一个struct soap类型的变量。当客户端程序访问远程方法前或当服务端程序能够接收一个请求前,必须先将这个运行环境变量初始化。在2.x版中新增了3个函数来负责这些事情:

函数 解释

soap_init(struct soap *soap) 初始化环境变量(只需执行一次)

struct soap *soap_new() 定义并初始化环境变量并返回一个该变量的指针

struct soap *soap_copy(struct soap *soap) 定义一个环境变量并从已有的环境变量中拷贝环境信息

环境变量定义好后就可以重复使用而不必再次初始化了。只有当线程独占访问时,我们才需要一个新的环境变量。例如,下面的代码分配了一个用于多个远程方法的环境变量:

int main()

{

struct soap soap;

...

soap_init(&soap); // 初始化环境变量

...

soap_call_ns__method1(&soap, ...); // 调用一个远程方法

...

soap_call_ns__method2(&soap, ...); // 调用另一个远程方法

...

soap_end(&soap); // 清除环境变量

...

}

我们也可以像下面这样定义环境变量:

int main()

{

struct soap *soap;

...

soap = soap_new(); // 定义并初始化环境变量

if (!soap) // 如果不能定义,退出

...

soap_call_ns__method1(soap, ...); // 调用远程函数

...

soap_call_ns__method2(soap, ...); // 调用另一个远程函数

...

soap_end(soap); // 清除环境变量

...

free(soap); // 释放环境变量空间

}

服务端代码在调用soap_serve函数前,需要定义相关环境变量:

int main()

{

struct soap soap;

soap_init(&soap);

soap_serve(&soap);

}

或者像下面这样:

int main()

{

soap_serve(soap_new());

}

soap_serve函数用来处理一个或多个(当允许HTTP keep-alive时,参见18.11节中的SOAP_IO_KEEPALIVE标志)请求。

一个web服务可以用多线程技术来处理请求:

int main()

{

struct soap soap1, soap2;

pthread_t tid;

...

soap_init(&soap1);

if (soap_bind(&soap1, host, port, backlog) < 0) exit(1);

if (soap_accept(&soap1) < 0) exit(1);

pthread_create(&tid, NULL, (void*(*)(void*))soap_serve, (void*)&soap1);

...

soap_init(&soap2);

soap_call_ns__method(&soap2, ...); // 调用远程方法

...

soap_end(&soap2);

...

pthread_join(tid, NULL); // 等待线程结束

soap_end(&soap1); // 释放环境变量

}

在上面的例子中,需要两个环境变量信息。而在1.x版本中,由于静态分配环境变量,多线程技术是不被允许的(只有一个线程可以用这个环境变量调用远程方法或处理请求信息)。

8.2.4节将给出一个具体的多线程服务实例,它为每个SOAP请求分配一个独立线程进行处理。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有