gSOAP calc服务端与客户端示例
1. Web服务定义描述头文件
typedef double xsd__double;
int ns__add(xsd__double a, xsd__double b, xsd__double &result);
int ns__sub(xsd__double a, xsd__double b, xsd__double &result);
int ns__sqrt(xsd__double a, xsd__double &result);
2. 生成服务端与客户端代码
soapcpp2 calc.h

3. 服务端工程 / 客户端工程对比


4. 服务端main.cpp
#include "soapH.h"
#include <math.h> int http_get(struct soap *soap)
{
FILE *fd = NULL;
fd = fopen("ns.wsdl", "rb");
if (!fd)
{
return ;
}
soap->http_content = "text/xml";
soap_response(soap, SOAP_FILE); while(true)
{
size_t r = fread(soap->tmpbuf, , sizeof(soap->tmpbuf), fd); if (!r) break;
if (soap_send_raw(soap, soap->tmpbuf, r)) break;
}
fclose(fd);
soap_end_send(soap); return SOAP_OK;
} int http_get1(struct soap *soap)
{
std::string fileName="ns.wsdl"; FILE *fd = NULL;
fd = fopen(fileName.c_str(), "rb");//openWSDLfiletocopy
if(!fd)
{
return ; //return HTTP not found error
}
soap->http_content="text/xml"; //HTTP header with text/xml content
soap_response(soap,SOAP_FILE);
while (true)
{
size_t r=fread(soap->tmpbuf,,sizeof(soap->tmpbuf),fd);
if(!r) break;
if(soap_send_raw(soap,soap->tmpbuf,r)) break; //cannot send, but little we can do about that
}
fclose(fd);
soap_end_send(soap);
return SOAP_OK;
} int main()
{
struct soap soap;
int m, s;
soap_init(&soap);
soap.fget = http_get; m = soap_bind(&soap, NULL, , ); if (m < )
{
soap_print_fault(&soap, stderr);
exit(-);
} fprintf(stderr, "Socket connection successful: master socket = %d\n", m); for (int i=; ; i++)
{
s = soap_accept(&soap); //接受请求
if (s < )
{
soap_print_fault(&soap, stderr);
break;
} fprintf(stderr, "%d: accepted connection from IP=%d.%d.%d.%d socket=%d",
i, (soap.ip >> )&0xFF, (soap.ip >> )&0xFF, (soap.ip >> )&0xFF, soap.ip&&0xFF, s); //打印出接受请求的详细信息 if (soap_serve(&soap) != SOAP_OK) //处理请求
soap_print_fault(&soap, stderr);
fprintf(stderr, "request served\n"); soap_destroy(&soap); //清理soap类实例
soap_end(&soap); //清理soap相关的所有资源并关闭连接
}
soap_done(&soap); return soap_serve(soap_new());
} int ns__add(struct soap *soap, double a, double b, double &result)
{
result = a + b;
return SOAP_OK;
} int ns__sub(struct soap *soap, double a, double b, double &result)
{
result = a - b;
return SOAP_OK;
} int ns__sqrt(struct soap *soap, double a, double &result)
{ if (a >= )
{
result = sqrt(a);
return SOAP_OK;
}
else
return soap_receiver_fault(soap, "Square root of negative number", "I can't only take the square root of a non-negative number");
} SOAP_NMAC struct Namespace namespaces[] =
{
{"SOAP-ENV", "http://schemas.xmlsoap.org/soap/envelope/", "http://www.w3.org/*/soap-envelope", NULL},
{"SOAP-ENC", "http://schemas.xmlsoap.org/soap/encoding/", "http://www.w3.org/*/soap-encoding", NULL},
{"xsi", "http://www.w3.org/2001/XMLSchema-instance", "http://www.w3.org/*/XMLSchema-instance", NULL},
{"xsd", "http://www.w3.org/2001/XMLSchema", "http://www.w3.org/*/XMLSchema", NULL},
{"ns", "http://tempuri.org/ns.xsd", NULL, NULL},
{NULL, NULL, NULL, NULL}
};
5. 客户端main.cpp
#include "soapH.h" int main()
{
struct soap calc_soap; soap_init(&calc_soap); double result = -; /*
soap_call_ns__add(
struct soap *soap,
const char *soap_endpoint,
const char *soap_action,
double a,
double b,
double &result) */
//调用成功返回标准0
int flag = soap_call_ns__add(&calc_soap, "http://localhost:9001", "", 1.0, 6.9, result); std::cout<<"result="<<result<<", flag="<<flag<<std::endl; flag = soap_call_ns__sqrt(&calc_soap, "http://localhost:9001", "", , result);
std::cout<<"result="<<result<<", flag="<<flag<<std::endl; return ;
}; SOAP_NMAC struct Namespace namespaces[] =
{
{"SOAP-ENV", "http://schemas.xmlsoap.org/soap/envelope/", "http://www.w3.org/*/soap-envelope", NULL},
{"SOAP-ENC", "http://schemas.xmlsoap.org/soap/encoding/", "http://www.w3.org/*/soap-encoding", NULL},
{"xsi", "http://www.w3.org/2001/XMLSchema-instance", "http://www.w3.org/*/XMLSchema-instance", NULL},
{"xsd", "http://www.w3.org/2001/XMLSchema", "http://www.w3.org/*/XMLSchema", NULL},
{"ns", "http://tempuri.org/ns.xsd", NULL, NULL},
{NULL, NULL, NULL, NULL}
};
6 服务端与客户端调试

gSOAP calc服务端与客户端示例的更多相关文章
- 【GoLang】golang HTTP GET/POST JSON的服务端、客户端示例,包含序列化、反序列化
服务端代码示例: package main import ( "encoding/json" "fmt" "io/ioutil" " ...
- Hessian服务端和客户端示例
一.服务端 1.创建web项目,建立客户端调用的hessian接口和实现类. 接口: package com.ymx.hessian.service; import com.ymx.hessian.s ...
- 简单的UDP服务端和客户端示例
UDP的理论不再多说,我这里直接给出一个关于UDP的HelloWorld程序,代码明了,希望对刚入门的学生有所帮助! 当然,实际上,在这块我也刚入门! 首先写服务端代码,服务端邦定本地的IP和端口来监 ...
- 基于Select模型的Windows TCP服务端和客户端程序示例
最近跟着刘远东老师的<C++百万并发网络通信引擎架构与实现(服务端.客户端.跨平台)>,Bilibili视频地址为C++百万并发网络通信引擎架构与实现(服务端.客户端.跨平台),重新复习下 ...
- 使用flask_socketio实现服务端向客户端定时推送
websocket连接是客户端与服务器之间永久的双向通信通道,直到某方断开连接. 双向通道意味着在连接时,服务端随时可以发送消息给客户端,反之亦然,这在一些需要即时通讯的场景比如多人聊天室非常重要. ...
- C# 编写WCF简单的服务端与客户端
http://www.wxzzz.com/1860.html Windows Communication Foundation(WCF)是由微软开发的一系列支持数据通信的应用程序框架,可以翻译为Win ...
- QUdpSocket-Qt使用Udp通讯实现服务端和客户端
版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:QUdpSocket-Qt使用Udp通讯实现服务端和客户端 本文地址:https:// ...
- 采用MQTT协议实现android消息推送(2)MQTT服务端与客户端软件对比、android客户端示列表
1.服务端软件对比 https://github.com/mqtt/mqtt.github.io/wiki/servers 名称(点名进官网) 特性 简介 收费 支持的客户端语言 IBM MQ 完整的 ...
- 常量,字段,构造方法 调试 ms 源代码 一个C#二维码图片识别的Demo 近期ASP.NET问题汇总及对应的解决办法 c# chart控件柱状图,改变柱子宽度 使用C#创建Windows服务 C#服务端判断客户端socket是否已断开的方法 线程 线程池 Task .NET 单元测试的利剑——模拟框架Moq
常量,字段,构造方法 常量 1.什么是常量 常量是值从不变化的符号,在编译之前值就必须确定.编译后,常量值会保存到程序集元数据中.所以,常量必须是编译器识别的基元类型的常量,如:Boolean ...
随机推荐
- SQLServer2005 没有日志文件(*.ldf) 只有数据文件(*.mdf) 恢复数据库的方法
代码如下: exec sp_attach_db exun,'d:\exun2.mdf' (可能执行一次不能成功,测试了下,有时候需要执行2次以上命令才行) 执行了之后,记得刷新数据库,不然是不会显示的
- SPARK Day04
广播变量和累加器 广播变量 广播变量理解图 广播变量使用 val conf = new SparkConf() conf.setMaster("local").setAppName ...
- Java中的TreeMap及红黑树
TreeMap: http://blog.csdn.net/tobeandnottobe/article/details/7232664 红黑树: http://blog.chinaunix.net/ ...
- mysql自定义function 写递归查询子节点
#存储文本信息表 CREATE TABLE WordInfoEntity( word_id ) PRIMARY KEY NOT NULL, # 主键ID UUID word_greda :正文文本 , ...
- MYSQL中LIMIT用法_后台分页
LIMIT是MySQL内置函数,其作用是用于限制查询结果的条数. 1)其语法格式如下: LIMIT[位置偏移量,]行数 其中,中括号里面的参数是可选参数,位置偏移量是指MySQL查询分析器要从哪一行开 ...
- day40-Spring 02-事务的回顾
- Error configuring application listener of class org.springframework.web.context.ContextLoaderListene 标签: tomcat
今天敲完ssm框架,启动tomcat时报了这个错误.如图: SEVERE: Error configuring application listener of class org.springfram ...
- 2018-11-3-WPF-内部的5个窗口之-MediaContextNotificationWindow
title author date CreateTime categories WPF 内部的5个窗口之 MediaContextNotificationWindow lindexi 2018-11- ...
- 干货 | 解读MySQL 8.0新特性:Skip Scan Range
MySQL从8.0.13版本开始支持一种新的range scan方式,称为Loose Skip Scan.该特性由Facebook贡献.我们知道在之前的版本中,如果要使用到索引进行扫描,条件必须满足索 ...
- python print函数