用C实现WebService[1]

原文出自:http://blog.chinaunix.net/uid-20314256-id-1967288.html

 

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

#cat 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 );




#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 <server_port> \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 <stdio.h>
#include <stdlib.h>
#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="http://localhost:4567/";
     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
你会看到两个终端可以互相通信了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值