用C实现WebService

一、系统环境

Linux 操作系统 kernel2.4.2,安装 gsoap2.6 到目录/usr/local/gsoap

二、gSOAP 的简要使用例子

下面是一个简单的例子,实现一个加法运算的 WebService,具体功能是客户端(client)输入 num1 和 num2,服务器端(server)返回 num1 和 num2 相加的结果 sum。
1、首先,我们需要做的是写一个函数声明文件,来定义接口函数 ns__add,文件名字为 add.h,内容如下:

//gsoap ns service name: add
//gsoap ns service namespace: http://mail.263.net/add.wsdl
//gsoap ns service location: http://mail.263.net
//gsoap ns service executable: add.cgi
//gsoap ns service encoding: encoded
//gsoap ns schema namespace: urn:add
int ns__add( int num1, int num2, int* sum );

2、然后我们需要创建文件 Makefile,从而利用 gsoapcpp2 工具由 add.h 生成一些 .xml 文件、.c 文件和 .h 文件,这些文件均为自动生成,Makefile的内容如下:

GSOAP_ROOT=/usr/local/gsoap
WSNAME=add
CC=g++ -g -DWITH_NONAMESPACES
INCLUDE=-I $(GSOAP_ROOT)
SERVER_OBJS=$(WSNAME)C.o $(WSNAME)Server.o stdsoap2.o
CLIENT_OBJS=$(GSOAP_ROOT)/env/envC.o $(WSNAME)ClientLib.o stdsoap2.o
ALL_OBJS=${WSNAME}server.o $(WSNAME)C.o $(WSNAME)Server.o ${WSNAME}test.o
${WSNAME}client.o $(WSNAME)ClientLib.o
#总的目标
all:server
${WSNAME}.wsdl:${WSNAME}.h
$(GSOAP_ROOT)/soapcpp2 -p$(WSNAME) -i -n -c ${WSNAME}.h
stdsoap2.o:$(GSOAP_ROOT)/stdsoap2.c
$(CC) -c $?
#编译一样生成规则的.o文件
$(ALL_OBJS):%.o:%.c
$(CC) -c $? $(INCLUDE)
#编译服务器端
server:Makefile ${WSNAME}.wsdl ${WSNAME}server.o $(SERVER_OBJS)
$(CC) ${WSNAME}server.o $(SERVER_OBJS) -o ${WSNAME}server
#编译客户端
client:Makefile ${WSNAME}.wsdl ${WSNAME}client.c ${WSNAME}test.c $(ALL_OBJS) stdsoap2.o
$(CC) ${WSNAME}test.o ${WSNAME}client.o $(CLIENT_OBJS) -o ${WSNAME}test
cl:
rm -f *.o *.xml *.a *.wsdl *.nsmap $(WSNAME)H.h $(WSNAME)C.c $(WSNAME)Server.c $(WSNAME)Client.c
$(WSNAME)Stub.* $(WSNAME)$(WSNAME)Proxy.* $(WSNAME)$(WSNAME)Object.* $(WSNAME)ServerLib.c
$(WSNAME)ClientLib.c $(WSNAME)server ns.xsd $(WSNAME)test

3、我们先来做一个 server 端,创建文件 addserver.c 文件,内容如下:

#include "addH.h"
#include "add.nsmap"
int main(int argc, char **argv)
{
  int m, s; /* master and slave sockets */
  struct soap add_soap;
  soap_init(&add_soap);
  soap_set_namespaces(&add_soap, add_namespaces);
  if (argc < 2)
  {
    printf("usage: %s\n", argv[0]);
    exit(1);
  }
  else
  {
    m = soap_bind(&add_soap, NULL, atoi(argv[1]), 100);
    if (m < 0)
    {
      soap_print_fault(&add_soap, stderr);
      exit(-1);
    }
    fprintf(stderr, "Socket connection successful: master socket = %d\n", m);
    for ( ; ; )
    {
      s = soap_accept(&add_soap);
      if (s < 0)
      {
        soap_print_fault(&add_soap, stderr);
        exit(-1);
      }
      fprintf(stderr, "Socket connection successful: slave socket = %d\n", s);
      add_serve(&add_soap);//该句说明该server的服务
      soap_end(&add_soap);
    }
  }
  return 0;
}
//server端的实现函数与add.h中声明的函数相同,但是多了一个当前的soap连接的参数
int ns__add(struct soap *add_soap, int num1, int num2, int *sum)
{
  *sum = num1 + num2;
  return 0;
}    

4、让我们的server跑起来吧:

shell>make
shell>./addserver 8888

如果终端打印出“Socket connection successful: master socket = 3”,那么你的 server 已经在前台 run 起来了,应该是值得高兴的!打开IE,键入http://localhost:8888,显示XML,服务已...〕Socket connection successful: slave socket = 4”,表示服务接收到了一次soap的连接。

时间: 2024-09-18 00:23:27

用C实现WebService的相关文章

其他调用WebService方法

Ajax调用WebService 但是这样会出现跨域请求问题 1.  什么是跨域请求?   Host 1. sina.com--=->baidu.com/xxx.jsp 2. localhost----à192.168.42.165 2. 解决ajax跨域请求webservice的问题? 在客户端应用中使用Java编码去请求webservice, 在页面中去请求自己的后台 jQuery调用WebService HttpURLConnection调用WebService

MDataTable属性RecordsAffected新应用:WebService与Json交互的记录总数

一:事出总有因:   1:需要来源: 最近有网友给我问了一个需求功能,大体需要功能如下:  1:有一台服务器,以WebService或WCF方式提供数据. 2:有客户端(Web或Winform),调用远程WebService或WCF的数据,然后绑定显示表格数据,关键还需要带有分页功能. 2:解决方案:  由于网友使用 CYQ.Data ,我给出了以下建议: 1:WebService 端:通过MAction,查询出表(MDataTable),再调用ToJson返回json输出. 2:客户端:通过调

Sharepoint 2010自定义WebService找不到网站应用程序的问题

错误描述:Net 开发WebService调用Microsoft.SharePoint.dll的服务器端对象模型,出现找不到网站的应用程序,或者出现500错误. 错误截图: [Webservice调用页错误] System.IO.FileNotFoundException: 找不到位于 http://localhost 的 Web 应用程序.请确认正确键入了此 URL.如果此 URL 需要提供现有内容,则系统管理员可能需要添加到指定应用程序的新请求 URL 映射. 在 Microsoft.Sha

java程序调用xfire发布的webService服务(二)

在上一篇的调用xfire发布的webService服务中,我只是从服务端返回了一个字符串给客户端,却没有测试从客户端传递数据给服务端.而实际应用中一般是不太可能只出现这样的应用场景的,因此我便更进一步测试了客户端传递数据给服务端. 因为相关的jar包在上一篇已经说过,因此便不再重复说明,这次的测试步骤如下: 一.测试向服务端传递字符串(重点在第二个):     为了进一步理解服务搭建,我重新写了一个服务端服务类: 接口: package xfireTest; public interface X

WebService大讲堂之Axis2(8):异步调用WebService

上一篇:WebService大讲堂之Axis2(7):将Spring的装配JavaBean发布成WebService 在前面几篇文章中都是使用同步方式来调用WebService.也就是说,如果被调用的WebService方法长 时间不返回,客户端将一直被阻塞,直到该方法返回为止.使用同步方法来调用WebService虽然很直观, 但当WebService方法由于各种原因需要很长时间才能返回的话,就会使客户端程序一直处于等待状态,这 样用户是无法忍受的. 当然,我们很容易就可以想到解决问题的方法,

eb ervice-C# WebService在接收到带参数的接口调用时自动将加密的参数解密

问题描述 C# WebService在接收到带参数的接口调用时自动将加密的参数解密 我的WebService的所有接口调用的参数都是加密过的,而且有接口函数.我在想有没有什么办法,在WebService接收到接口调用请求时,自动将参数解密,而不需要我每个函数内写解密?????? 我暂时没有C币了,有一定奉上 解决方案 我在Spring里面是使用filter过滤器机制来做的!所有的请求都先通过filter,在filter里面做统一的处理,然后再分发到各个具体的controller去.我觉得这种思路

axis2开发webservice(1)

开发webservice之前要先看一眼什么是webservice,并且了解一下webservice的概念. SOAP SOAP(Simple Object Access Protocol),关于SOAP教程:http://www.w3school.com.cn/soap/index.asp l SOAP 指简易对象访问协议 l SOAP 是一种通信协议 l SOAP 用于应用程序之间的通信 l SOAP 是一种用于发送消息的格式 l SOAP 被设计用来通过因特网进行通信 l SOAP 独立于平

msdiscocodegenerator-VS 2008 更新Webservice服务时,报自定义工具MSDiscoCodeGenerator 失败 错

问题描述 VS 2008 更新Webservice服务时,报自定义工具MSDiscoCodeGenerator 失败 错 网上说的方法:1.卸载.net Compact 3.5 ,重装 2.重新引用 3.重装VS2008 环境 4.重装.net framework 3.5 方法全试了,还是没有解决.系统昨天还是好好的,今天更新了几个补丁,就出这个问题,各位大哥大姐们 ,你们有没有遇到这个情况,有什么解决方法没有?

Flex4 +WebService XFire

<?xml version="1.0" encoding="utf-8"?><s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" creationComplete="application1_creationCompleteHandler(event)"      xmlns:s="library://ns.adobe.com/flex/Sp

WebService-Java中WebService实例

  Java与WCF交互(二):WCF客户端调用Java web service   中国万睡 Java中WebService实例   2013-04-11 15:19:01|  分类: WebService |  标签: |举报 |字号大中小 订阅 Web Services是由企业发布的完成其特定商务需求的在线应用服务,其他公司或应用软件能够通过Internet来访问并使用这项在线服务. Web Service的关键技术和规则: 1.XML:描述数据的标准方法. 2.SOAP:表示信息交换的协