近日在学习C++,偶然遇到网友想用C#调用gsoap生成的C++服务的问题,遂决定研究一下,网上搜索了很久,大多数是C++调用C#的应用....

经过本人的不断努力,终于找到一种解决问题的方法,总结如下:

1. 下载gsoap工具

地址:http://sourceforge.net/projects/gsoap2/files/gSOAP/

点击Download 下载最新版工具,解压文件

2. C++编写Sever端

用VS2010新建一个Win32控制台应用程序,命名Server,选择空项目,其他默认即可。

添加一个add.cpp和add.h,在add.h中声明一个函数int ns__add(int num1, int num2, int *sum);

将add.h复制到gsoap_2.8.16\gsoap-2.8\gsoap\bin\win32目录下,打开cmd,进入当前目录,敲入命令soapcpp2.exe add.h,回车:

得到以下文件

将soapH.h、soapStub.h、soapC.cpp、soapServer.cpp、ns.nsmap和gsoap_2.8.16\gsoap-2.8\gsoap目录中的stdsoap2.h、stdsoap2.cpp拷贝到项目中,打开add.cpp文件,添加内容如下:

#include "add.h"
#include "ns.nsmap"
#include "cstring"
using namespace std;
int main(int argc, char* argv[])
{
 int nPort = 8080;
 struct soap fun_soap;
 soap_init(&fun_soap);
 int nMaster = (int)soap_bind(&fun_soap, NULL, nPort, 100);
 if (nMaster < 0)
 {
  soap_print_fault(&fun_soap, stderr);
  exit(-1);
 }
 fprintf(stderr, "Socket connection successful : master socket = %d\n", nMaster);
 while (true)
 {
  int nSlave = (int)soap_accept(&fun_soap);
  if (nSlave < 0)
  {
   soap_print_fault(&fun_soap, stderr);
   exit(-1);
  }
  fprintf(stderr, "Socket connection successful : slave socket = %d\n", nSlave);
  soap_serve(&fun_soap);
  soap_end(&fun_soap);
 }
 cin.get();
 return 0;
}
//server端的实现函数与add.h中声明的函数相同,但是多了一个当前的soap连接的参数
int ns__add(struct soap *add_soap, int num1, int num2, int *sum)
{
 *sum = num1 + num2;
 return 0;
}

项目目录如下:

编译,运行如下:

说明服务已成功启动。验证以下,在浏览器中输入http://localhost:8080,回车,如果成功可看到

3. C#编写Client端

新建一个空白网站项目,右键单击项目,选择添加web引用

将会看到如下界面,在URL输入用gsoap生成的ns.wsdl文件路径,然后点击“添加引用”按钮

空白网站中将会得到如下目录

打开vs2010命令行工具(vs2010旗舰版在菜单栏中:“工具”->“visual studio 命令提示”),进入Service.wsdl文件所在目录,输入如下命令wsdl  /o: Service.wsdl

wsdl工具vs2010自带。

成功后将会在目录中得到Service.cs 文件

新建C#控制台应用程序,将Service.cs文件添加到项目中,添加 System.Web.Services 引用

在Program.cs文件中编写如下代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Service s = new Service();
            s.Url = "http://localhost:8080";
            add d = new add();
            d.num1 = 200;
            d.num2 = 100;
            addResponse ar = s.add(d);
            Console.WriteLine(ar.sum);
            Console.ReadKey();
        }
    }
}

启动C++的Server项目,同时运行C#控制台项目,一切顺利将会显示如下:

转自:https://blog.csdn.net/guhun_shmily/article/details/13997093

C#作为客户端调用gsoap生成的C++服务端的更多相关文章

  1. Linux下用gSOAP开发Web Service服务端和客户端程序

    网上本有一篇流传甚广的C版本的,我参考来实现,发现有不少问题,现在根据自己的开发经验将其修改,使用无误:另外,补充同样功能的C++版本,我想这个应该更有用,因为能用C++,当然好过受限于C. 1.gS ...

  2. Linux下用gSOAP开发Web Service服务端和客户端程序(一)

    1.功能说明: 要开发的Web Service功能非常简单,就是一个add函数,将两个参数相加,返回其和. 2.C版本的程序: (1)头文件:SmsWBS.h,注释部分不可少,url部分的IP必须填写 ...

  3. 使用Eclipse自带Web Service插件(Axis1.4)生成Web Service服务端/客户端

    创建一个名字为math的Java web工程,并将WSDL文件拷入该工程中 将Axis所需的jar包拷贝至WebRoot\WEB-INF\lib目录下,这些jar包会自动导入math工程中 一,生成W ...

  4. Eclipse+Axis使用WSDL文件生成Web Service服务端/客户端

    JDK版本:1.5.0_22 Eclipse版本:Helios Service Release 2(3.6.2) WSDL文件的创建过程见http://blog.csdn.net/a19881029/ ...

  5. 使用Eclipse自带的Axis1插件生成Web Service服务端客户端

    JDK版本:1.5.0_22 Eclipse版本:Helios Service Release 2(3.6.2) WSDL文件的创建过程见http://blog.csdn.net/a19881029/ ...

  6. 客户端(springmvc)调用netty构建的nio服务端,获得响应后返回页面(同步响应)

    后面考虑通过netty做一个真正意义的简约版RPC框架,今天先尝试通过正常调用逻辑调用netty构建的nio服务端并同步获得返回信息.为后面做铺垫 服务端实现 我们先完成服务端的逻辑,逻辑很简单,把客 ...

  7. 客户端 new socket时候 就像服务端发起连接了

    客户端 new socket时候  就像服务端发起连接了

  8. 【grpc proto】python使用proto文件生成简易的服务端和客户端

    1.安装python-grpc(注意,是grpcio包,不是grpc包!) pip install grpcio 2.编写.proto文件 grpc教程:http://doc.oschina.net/ ...

  9. winform客户端利用webClient实现与Web服务端的数据传输

    由于项目需要,最近研究了下WebClient的数据传输.关于WebClient介绍网上有很多详细介绍,大概就是利用WebClient可以实现对Internet资源的访问.无外乎客户端发送请求,服务端处 ...

随机推荐

  1. [CC-CMPVIRS]Computer Virus

    [CC-CMPVIRS]Computer Virus 题目大意: 有一张纸带,从左到右被分成了\(n(n\le10^7)\)个格子,在刚开始,第\(i\)个格子上写着数字\(i\).这张纸带被分成了从 ...

  2. dd制作linux启动盘

    1.fdisk /dev/sdb 删除分区,新建分区 2.mkfs.vfat /dev/sdb1 3.dd bs=4M if=CentOS.iso of=/dev/sdb

  3. MySQL(七)

    视图 对于复杂的查询,在多次使用后,维护是一件非常麻烦的事情 解决:定义视图 视图本质就是对查询的一个封装 定义视图 create view stuscore as select students.* ...

  4. 游戏UI规范

    在满足效果的前提下,尽量做到UI资源做到复用和最小化 1.  背景1和背景2分开切,可以组合成各种不同的面包背景图 2.  背景1和背景2在没有花纹的情况下,中间纯色的部分切4个像素做就公共个缩放就可 ...

  5. sklearn LDA降维算法

    sklearn LDA降维算法 LDA(Linear Discriminant Analysis)线性判断别分析,可以用于降维和分类.其基本思想是类内散度尽可能小,类间散度尽可能大,是一种经典的监督式 ...

  6. sql 2008 查询性能优化笔记

    索引: set statistics io on select p.productID,p.name,p.Weight,p.StandardCost from production.product p ...

  7. SpringMVC Controller之间的重定向和转发

    同一个controller之间重定向和转发 ①redirect 在Controller的映射方法中,其返回值改为:return "redirect:XXX"; ②forward 这 ...

  8. 12、mysql补充

    本篇导航: 视图 触发器 事务 存储过程 函数 流程控制 一.视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,可 ...

  9. Canvas 和 SVG 的不同

    Canvas 和 SVG 都允许您在浏览器中创建图形,但是它们在根本上是不同的. SVG SVG 是一种使用 XML 描述 2D 图形的语言. SVG 基于 XML,这意味着 SVG DOM 中的每个 ...

  10. SpringMVC的拦截器(Interceptor)和过滤器(Filter)的区别与联系

    摘自: http://blog.csdn.net/xiaoyaotan_111/article/details/53817918 一 简介 (1)过滤器: 依赖于servlet容器.在实现上基于函数回 ...