最近我在网上找一些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) |