Calculator客户端和服务器示例
概述此示例在C中实现了一个简单的SOAP / XML API客户端和服务器。Web服务规范示例计算器XML Web服务calc.h在gSOAP soapcpp2工具要处理的文件中指定。该calc.h规范定义了五个计算器方法addsubmuldiv和pow//gsoap ns service name: calc Simple calculator service described at https://www.genivia.com/dev.html //gsoap ns service protocol: SOAP //gsoap ns service style: rpc //gsoap ns service encoding: encoded //gsoap ns service namespace: http://websrv.cs.fsu.edu/~engelen/calc.wsdl //gsoap ns service location: http://websrv.cs.fsu.edu/~engelen/calcserver.cgi //gsoap ns schema namespace: urn:calc //gsoap ns service method: add Sums two values int ns__add(double a, double b, double *result); //gsoap ns service method: sub Subtracts two values int ns__sub(double a, double b, double *result); //gsoap ns service method: mul Multiplies two values int ns__mul(double a, double b, double *result); //gsoap ns service method: div Divides two values int ns__div(double a, double b, double *result); //gsoap ns service method: pow Raises a to b int ns__pow(double a, double b, double *result);此示例calc.h文件是手动定义的。可以通过在一个或多个Web服务的WSDL上运行wsdl2h命令来自动获取具有Web服务规范的这些特殊“头文件”wsdl2h -c -o calc.h http://www.genivia.com/calc.wsdl这是calc.h从指定的WSDL calc.wsdl文件生成的。在运行wsdl2h之前我们建议修改typemap.dat以将XML名称空间前缀绑定到wsdl2h将使用的名称空间URI。由于此服务使用URI“urncalc”并且我们希望将其绑定到ns前缀因此我们应将以下行添加到typemap.datns urn:calc要从WSDL获取名称空间URI请在WSDL上运行wsdl2h然后从生成的头文件中检索它们它们位于顶部。然后在添加要与命名空间关联的前缀名称后重新运行wsdl2h命令typemap.dat。关于Web服务规范语法的一些注释gSOAP“头文件”中的Web服务规范定义了服务和数据绑定接口。该规范使用带有指令和注释的普通C / C 语法。C / C 类型和成员的XML名称空间限定是通过带有双下划线的C / C 标识符命名约定来完成的就像ns__add将前缀绑定ns到add。也可以使用冒号ns:addns:用soapcpp2剥离。 用于声明应该序列化为XML属性的struct和class成员。数据成员的缺省值可以直接在struct或class声明中赋值。XML元素和属性出现约束minOccurs:maxOccurs在结构或类成员声明的末尾声明为表单。XML元素重复是STL容器或动态数组。动态数组是一对大小字段和数组指针成员例如$int size; struct ns__employee_record *manages是size指向的长度数组manages。XML Web服务操作被声明为函数其中最后一个参数是指向结果值的指针或引用。使用结构或类返回多个值。这些//gsoap指令用于绑定XML名称空间并定义SOAP Web服务属性//gsoap prefix service name: WSDLserviceName documentationText //gsoap prefix service style: [rpc|document] //gsoap prefix service encoding: [literal|encoded] //gsoap prefix service namespace: WSDLnamespaceURI //gsoap prefix service location: WSDLserviceAddressLocationURI绑定Web服务操作属性//gsoap prefix service method-style: methodName [rpc|document] //gsoap prefix service method-encoding: methodName [literal|encoded] //gsoap prefix service method-action: methodName actionString //gsoap prefix service method-documentation: methodName documentation要定义类型架构属性//gsoap prefix schema namespace: schemaNamespaceURI //gsoap prefix schema elementForm: [qualified|unqualified] //gsoap prefix schema attributeForm: [qualified|unqualified] //gsoap prefix schema documentation: documentationText //gsoap prefix schema type-documentation: typeName documentationText这里prefix是C / C 名称中使用的XML名称空间前缀例如nsin ns__add。具有服务和数据绑定接口的Web服务规范由soapcpp2处理以生成服务和数据绑定实现代码请参阅下面的构建步骤。实现客户端应用程序客户端应用程序calcclient.c在命令行运行并使用命令行参数调用计算器Web服务来添加减去乘除或增加两个浮点数的幂#include soapH.h #include calc.nsmap /* the Web service endpoint URL */ const char server[] http://websrv.cs.fsu.edu/~engelen/calcserver.cgi; int main(int argc, char **argv) { struct soap *soap soap_new1(SOAP_XML_INDENT); /* new context */ double a, b, result; if (argc 4) { fprintf(stderr, Usage: [add|sub|mul|div|pow] num num\n); exit(1); } a strtod(argv[2], NULL); b strtod(argv[3], NULL); switch (*argv[1]) { case a: soap_call_ns__add(soap, server, , a, b, result); break; case s: soap_call_ns__sub(soap, server, , a, b, result); break; case m: soap_call_ns__mul(soap, server, , a, b, result); break; case d: soap_call_ns__div(soap, server, , a, b, result); break; case p: soap_call_ns__pow(soap, server, , a, b, result); break; default: fprintf(stderr, Unknown command\n); exit(1); } if (soap-error) soap_print_fault(soap, stderr); else printf(result %g\n, result); soap_destroy(soap); /* delete deserialized objects */ soap_end(soap); /* delete heap and temp data */ soap_free(soap); /* were done with the context */ return 0; }请参阅有关如何使用HTTP代理和HTTPS 的教程。构建客户端应用程序的步骤为客户端生成服务和数据绑定接口soapcpp2 -c -r -CL calc.h其中option -c生成C代码option -r生成报告option只-CL生成客户端而没有未使用的lib文件。这会生成多个文件包括soapStub.h 没有注释的普通C / C 头文件语法规范的副本。 soapH.h 声明XML序列化程序。 soapC.c 实现XML序列化程序。 soapClient.c 实现客户端XML服务API。 calc.nsmap XML命名空间绑定表到#include soapReadme.md 服务和数据绑定接口详细信息。要构建示例客户端应用程序我们还需要stdsoap2.h和stdsoap2.cgcc -o calcclient calcclient.c stdsoap2.c soapC.c soapClient.c实现CGI服务器应用程序CGI服务器应用程序calcserver.c实现服务操作并接受stdin soap_serve(soap)上的请求将请求分派给这五个服务操作之一#include soapH.h #include calc.nsmap int main() { struct soap *soap soap_new(); /* new context */ soap_serve(soap); /* serve CGI request */ soap_destroy(soap); /* delete deserialized objects */ soap_end(soap); /* delete heap and temp data */ soap_free(soap); /* were done with the context */ return 0; } /* service operation function implementation */ int ns__add(struct soap *soap, double a, double b, double *result) { *result a b; return SOAP_OK; } /* service operation function implementation */ int ns__sub(struct soap *soap, double a, double b, double *result) { *result a - b; return SOAP_OK; } /* service operation function implementation */ int ns__mul(struct soap *soap, double a, double b, double *result) { *result a * b; return SOAP_OK; } /* service operation function implementation */ int ns__div(struct soap *soap, double a, double b, double *result) { if (b) *result a / b; else return soap_sender_fault(soap, Division by zero, NULL); return SOAP_OK; } /* service operation function implementation */ int ns__pow(struct soap *soap, double a, double b, double *result) { *result pow(a, b); if (soap_errno EDOM) /* soap_errno is like errno, but portable */ return soap_sender_fault(soap, Power function domain error, NULL); return SOAP_OK; }使用下面进一步讨论的构建步骤构建服务应用程序后将CGI应用程序安装在Web服务器的cgi-bin文件夹中。实现独立的服务器应用程序此示例显示了一个独立的迭代服务器它接受主机端口上的传入请求。该程序与CGI服务相同除了通过循环中的套接字调度服务请求#include soapH.h #include calc.nsmap int port 8080; int main() { SOAP_SOCKET m; /* master socket */ struct soap soap soap_new(); /* new context */ soap-send_timeout soap-recv_timeout 5; /* 5 sec socket idle timeout */ soap-transfer_timeout 30; /* 30 sec message transfer timeout */ m soap_bind(soap, NULL, port), 1); /* backlog1 for iterative servers, multi-threaded services should use 100 */ if (soap_valid_socket(m)) { while (soap_valid_socket(soap_accept(soap))) { soap_serve(soap); /* serve request */ soap_destroy(soap); /* delete deserialized objects */ soap_end(soap); /* delete heap and temp data */ } } soap_print_fault(soap, stderr); soap_destroy(soap); /* delete deserialized objects */ soap_end(soap); /* delete heap and temp data */ soap_free(soap); /* were done with the context */ return 0; }注意只要接受失败此服务器就会退出。最好是在发生短期连接问题时添加一些逻辑以继续。为了提高性能我们应该实现一个多线程服务器它可以同时处理请求并且在服务操作变得耗时时不会阻止其他客户端请求#include soapH.h #include calc.nsmap #include plugin/threads.h int port 8080; void *process_request(void *arg) { struct soap *soap (struct soap*)arg; THREAD_DETACH(THREAD_ID); if (soap) { soap_serve(soap); soap_destroy(soap); soap_end(soap); soap_free(soap); } return NULL; } int main() { SOAP_SOCKET m; /* master socket */ struct soap *soap soap_new1(SOAP_IO_KEEPALIVE); /* new context with HTTP keep-alive enabled */ soap-send_timeout soap-recv_timeout 5; /* 5 sec socket idle timeout */ soap-transfer_timeout 30; /* 30 sec message transfer timeout */ m soap_bind(soap, NULL, port), 100); if (soap_valid_socket(m)) { while (soap_valid_socket(soap_accept(soap))) { THREAD_TYPE tid; void *arg (void*)soap_copy(soap); /* use updated THREAD_CREATE from plugin/threads.h https://www.genivia.com/files/threads.zip */ if (arg) while (THREAD_CREATE(tid, (void*(*)(void*))process_request, arg)) sleep(1); } } soap_print_fault(soap, stderr); soap_destroy(soap); /* delete deserialized objects */ soap_end(soap); /* delete heap and temp data */ soap_free(soap); /* were done with the context */ return 0; }此服务器对可生成的线程数没有限制因此您可能希望保持受互斥锁保护的计数器不超过最大值。此外使用线程池可以提高整体性能。最好是使用ISAPI和Apache模块来开发gSOAP用户指南中建议的强大而安全的服务。请参阅有关如何使用线程池启用HTTPS以及如何强化独立服务的教程。请参阅有关如何使用ISAPI和Apache模块开发服务的文档。构建服务器应用程序的步骤使用以下命令为服务器端生成服务和数据绑定接口soapcpp2 -c -r -SL calc.h其中option -c生成C代码option -r生成报告option只-SL生成服务器端而没有未使用的lib文件。这会生成多个文件包括soapStub.h 没有注释的普通C / C 头文件语法规范的副本。 soapH.h 声明XML序列化程序。 soapC.c 实现XML序列化程序。 soapServer.c 实现服务器端XML服务API。 calc.nsmap XML命名空间绑定表到#include soapReadme.md 服务和数据绑定接口详细信息。要构建示例服务器应用程序我们还需要stdsoap2.h和stdsoap2.cgcc -o calcserver calcserver.c stdsoap2.c soapC.c soapServer.c运行示例./calcclient add 2 3result 5要在端口8080上对独立服务器运行该示例请更改server[] “http://localhost:8080”。

相关新闻

NBM7100A芯片在纽扣电池物联网设备中的能量优化方案

NBM7100A芯片在纽扣电池物联网设备中的能量优化方案

1. 项目背景与核心挑战 在物联网设备和可穿戴电子产品中,CR2032这类不可充电的纽扣电池是最常见的电源解决方案。这类电池虽然成本低廉、使用方便,但在实际应用中存在一个致命缺陷:当设备需要短时大电流(如无线模块发射信号时&…

2026/7/28 17:06:45 阅读更多 →
我把 Kafka 消费改成 EOS 事务后,资损从月均 30 万压到 0:幂等键 + Transactional Producer 实战

我把 Kafka 消费改成 EOS 事务后,资损从月均 30 万压到 0:幂等键 + Transactional Producer 实战

我把 Kafka 消费改成 EOS 事务后,资损从月均 30 万压到 0:幂等键 Transactional Producer 实战 凌晨 3 点 12 分,财务给我打电话,说上个月对账差了 31 万。我当时第一反应是数据库出问题了,结果查了一晚上&#xff0c…

2026/7/28 17:06:45 阅读更多 →
进程互斥和进程同步

进程互斥和进程同步

一、进程互斥由于进程具有独立性和异步性等并发特征,计算机的资源有限,导致了进程之间的资源竞争和共享,也导致了对进程执行过程的制约。1、临界资源和临界区(临界部分)临界资源:一次只能供一个进程访问的资…

2026/7/28 17:06:45 阅读更多 →

最新新闻

原来重庆口碑好的会议系统厂家这么多,究竟哪个好呢?

原来重庆口碑好的会议系统厂家这么多,究竟哪个好呢?

在重庆,会议系统市场发展得十分繁荣,众多厂家各有特色,让不少人在选择时犯了难。究竟哪个厂家的会议系统更好呢?下面就为大家深入分析。市场现状与痛点当前,会议系统的需求日益增长,无论是政府机构的政务研…

2026/7/28 17:17:48 阅读更多 →
yum install/update 错误 : sqlite3.DatabaseError: database disk image is malformed

yum install/update 错误 : sqlite3.DatabaseError: database disk image is malformed

错误信息: Running transaction check Running transaction test Transaction test succeeded Running transaction Traceback (most recent call last):File "/usr/bin/yum", line 29, in <module>yummain.user_main(sys.argv[1:], exit_codeTrue)File "…

2026/7/28 17:17:48 阅读更多 →
计算机毕业设计之《数据库原理及应用》课程平台

计算机毕业设计之《数据库原理及应用》课程平台

随着信息时代的来临&#xff0c;过去的传统管理方式缺点逐渐暴露&#xff0c;对过去的传统管理方式的缺点进行分析&#xff0c;采取计算机方式构建《数据库原理及应用》课程平台。本文通过课题背景、课题目的及意义相关技术&#xff0c;提出了一种教学资源、作业信息、新闻资讯…

2026/7/28 17:17:48 阅读更多 →
开源一套.NET平台的Excel COM 组件二次封装库

开源一套.NET平台的Excel COM 组件二次封装库

开源一套.NET平台的Excel COM 组件二次封装库 在日常的企业级开发中&#xff0c;Excel 文件的读写是一个高频需求。虽然 .NET 平台提供了多种方式操作 Excel&#xff0c;如 NPOI、EPPlus 或 OpenXML&#xff0c;但在某些场景下&#xff08;如调用 VBA 宏、保留复杂格式、与旧系…

2026/7/28 17:17:48 阅读更多 →
Word宋体引号变成了Times New Roman,如何批量改为宋体?

Word宋体引号变成了Times New Roman,如何批量改为宋体?

Word宋体引号变成了Times New Roman&#xff0c;如何批量改为宋体&#xff1f; 第一步 在Word中按快捷键Ctrl H&#xff0c;打开替换对话框 第二步 复制或输入一个中文引号到”查找内容“窗格&#xff08;上引号和下引号需要分别操作一次&#xff09;&#xff0c;这里用的是上…

2026/7/28 17:17:48 阅读更多 →
恋活!终极增强指南:HF Patch 200+插件一站式解决方案

恋活!终极增强指南:HF Patch 200+插件一站式解决方案

恋活&#xff01;终极增强指南&#xff1a;HF Patch 200插件一站式解决方案 【免费下载链接】KK-HF_Patch Automatically translate, uncensor and update Koikatu! and Koikatsu Party! 项目地址: https://gitcode.com/gh_mirrors/kk/KK-HF_Patch 你是否曾经为《恋活&a…

2026/7/28 17:16:48 阅读更多 →

日新闻

告别臃肿!3步让你的暗影精灵笔记本重获新生

告别臃肿!3步让你的暗影精灵笔记本重获新生

告别臃肿&#xff01;3步让你的暗影精灵笔记本重获新生 【免费下载链接】OmenSuperHub Control Omen laptop performance, fan speeds, and keyboard lighting, and unlock power limits. 项目地址: https://gitcode.com/gh_mirrors/om/OmenSuperHub 你是否也曾为官方Om…

2026/7/28 0:00:43 阅读更多 →
RAG必踩坑!财报法规检索不准?这款开源工具让答案浮出水面,准确率飙升98.7%!

RAG必踩坑!财报法规检索不准?这款开源工具让答案浮出水面,准确率飙升98.7%!

做 RAG 的人应该都踩过这个致命的坑&#xff1a;把几百页的财报、法规、技术手册扔给向量库&#xff0c;问一个具体问题&#xff0c;搜出来的全是沾边但没用的内容 —— 关键信息要么被硬切块拆碎了&#xff0c;要么藏在几十条结果的最下面。语义相似≠真正相关&#xff0c;这个…

2026/7/28 0:00:43 阅读更多 →
抖音视频文案提取工具全指南:免费2026版、手机App、在线工具一网打尽

抖音视频文案提取工具全指南:免费2026版、手机App、在线工具一网打尽

2026年做短视频运营&#xff0c;从抖音上扒文案早就不是偷偷抄笔记的事了。我刚开始做内容的时候&#xff0c;每天刷半小时抖音&#xff0c;手动把爆款视频的口播敲进备忘录&#xff0c;一条2分钟的视频得花十来分钟&#xff0c;碰到语速快的还要反复回听。后来试了一圈工具&am…

2026/7/28 0:00:43 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档&#xff0c;可以直接使用&#xff01;系统支持图片、视频、摄像头等多种方式检测裂缝&#xff0c;功能强大实用。 1数据集6000张 8各类别

2026/7/28 12:04:22 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像&#xff01; pubg绝地求生目标检测数据集 1分类&#xff1a;e_body&#xff0c;14905个标签&#xff0c;txt格式 共计14244张图&#xff0c;99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/28 8:29:16 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别&#xff1a; allies enemy tag图片总量&#xff1a;7247张训练集&#xff1a;5139张验证集&#xff1a;1425张测试集&#xff1a;683张标注状态&#xff1a;全部已标注&#xff0c;即拿即用数据格式&#xff1a;支持YOLO格式及其他格式&#…

2026/7/28 5:03:42 阅读更多 →

月新闻