Chinaunix首页 | 论坛 | 博客
  • 博客访问: 123058
  • 博文数量: 25
  • 博客积分: 1436
  • 博客等级: 上尉
  • 技术积分: 256
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-17 10:10
文章分类

全部博文(25)

文章存档

2016年(1)

2015年(5)

2012年(1)

2011年(3)

2010年(6)

2009年(8)

2008年(1)

我的朋友

分类: LINUX

2009-08-05 15:15:47

最近我在网上找一些web service 的例子找到了一篇“用C实现WebService”文章,而且很多人转载。但原文有一些错误。我花了好长时间才把它调通。为了下一位像我一样的新手不用再被折磨。我就把我改过的贴出来供大家分享。

#cat add.h
//gsoap ns service name: add
//gsoap ns service namespace:
//gsoap ns service location:
//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 );




#cat addserver.cpp            //原文保存的是addserver.c
#include "soapH.h"            //原文是#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);        //原文这个是打开的。
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);
soap_serve(&add_soap);//该句说明该server的服务        //原文是add_serve(&add_soap);
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;
}


另外还要从gsoap_2.7.13.tar.gz(或其他版本也可以)拷贝两个文件stdsoap2.cpp,stdsoap2.h到当前目录
cp gsoap-2.7/stdsoap2.cpp gsoap-2.7/stdsoap2.h ./target

最后是编译工作了,原文用的是Makefile的方法,但是有很多错误,载着我用简单的方法实现
1. soapcpp2 add.h
2. g++ -g -DWITH_NONAMESPACES -o addserver addserver.cpp soapC.cpp soapServer.cpp stdsoap2.cpp

这样server端就算是完成了,你用 ./addserver 4567 试试。


下面接着编辑客户端文件addclient.cpp
#cat addclient.cpp
#include
#include
#include "stdsoap2.h"
#include "soapH.h"
#include "add.nsmap"

int add(const char* server, int num1, int num2, int *sum);

int main(int argc, char **argv)
{
     int result = -1;
     char* server="";
     int num1 = 0;
     int num2 = 0;
     int sum = 0;
     if( argc < 3 )
     {
         printf("usage: %s num1 num2 \n", argv[0]);
         exit(0);
     }
     num1 = atoi(argv[1]);
     num2 = atoi(argv[2]);
     result = add(server, num1, num2, &sum);
     if (result != 0)
     {
         printf("soap err,errcode = %d\n", result);
     }
     else
     {
         printf("%d+%d=%d\n", num1, num2, sum );
     }
     return 0;
}

int add(const char* server, int num1, int num2, int *sum)
{
     struct soap add_soap;
     int result = 0;
     soap_init(&add_soap);

     soap_call_ns__add( &add_soap, server, "", num1, num2, sum );
     if(add_soap.error)
     {
         printf("soap error:%d,%s,%s\n", add_soap.error, *soap_faultcode(&add_soap), *soap_faultstring(&add_soap) );
         result = add_soap.error;
     }
     soap_end(&add_soap);
     soap_done(&add_soap);
     return result;
}

编译如下:
g++ -g -DWITH_NONAMESPACES -o addclient addclient.cpp soapClient.cpp soapC.cpp stdsoap2.cpp

这个程序完成了。
测试:
打开两个终端,一个运行 ./addserver 4567 然后另一个运行 ./addclient 21 68
你会看到两个终端可以互相通信了。
阅读(5859) | 评论(0) | 转发(0) |
0

上一篇:samba configure

下一篇:用C实现WebService[2]

给主人留下些什么吧!~~