1、gsoap编译很简单
E、编写测试程序:addtest.c
G、编译执行
./configure
make
2、用gsoap生成相关文件
第一种:根据wsdl生成
生成头文件:wsdl2h -o outfile.h infile.wsdl
生成源文件:soapcpp2 -c outfile.h
第二种:根据头文件生成
3、本次主要介绍根据头文件生成的方法(我也是从网上搜到的资料,并加以改进和测试。)
例子是实现在客户端输入2个数字,然后远程调用服务端的加法函数,最后返回结果给客户端。
A、编写头文件add.h
int ns__add( int num1, int num2, int* sum );
B、执行soapcpp2 -c add.h,会生成相关的文件。
C、编写服务端程序:addserver.c
#include "soapH.h"
#include "soapStub.h"
#include "ns.nsmap"
int main(int argc, char **argv)
{
int m, s;
struct soap add_soap;
soap_init(&add_soap);
soap_set_namespaces(&add_soap, namespaces);
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\r\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\r\n", s);
soap_serve(&add_soap);
soap_end(&add_soap);
}
}
return 0;
}
int ns__add(struct soap *add_soap, int num1, int num2, int *sum)
{
*sum = num1 + num2;
return 0;
}
#include "soapStub.h"
#include "ns.nsmap"
int add(const char *server, int num1, int num2, int *sum)
{
struct soap add_soap;
int result = 0;
soap_init(&add_soap);
soap_set_namespaces(&add_soap, namespaces);
soap_call_ns__add(&add_soap, server, NULL, num1, num2, sum);
printf("server is %s, num1 is %d, num2 is %d\r\n", server, num1, num2);
if(add_soap.error)
{
printf("soap error: %d, %s, %s\r\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;
}
E、编写测试程序:addtest.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int add(const char *server, int num1, int num2, int *sum);
int main(int argc, char **argv)
{
int result = -1;
char server[128] = {0};
int num1;
int num2;
int sum;
if(argc < 4)
{
printf("usage: %s <ip:port> num1 num2\r\n", argv[0]);
exit(1);
}
strcpy(server,argv[1]);
num1 = atoi(argv[2]);
num2 = atoi(argv[3]);
result = add(server, num1, num2, &sum);
if(result != 0)
{
printf("soap error, errcode=%d \r\n", result);
}
else
{
printf("%d + %d = %d\r\n", num1, num2, sum);
}
return 0;
}
GSOAP_ROOT = /mnt/hgfs/work/onvif/gsoap-2.8/gsoap
WSNAME = add
CC = g++ -g -DWITH_NONAMESPACES
INCLUDE = -I$(GSOAP_ROOT)
SERVER_OBJS = soapC.o stdsoap2.o soapServer.o $(WSNAME)server.o
CLIENT_OBJS = soapC.o stdsoap2.o soapClient.o $(WSNAME)client.o $(WSNAME)test.o
all: server client
server: $(SERVER_OBJS)
$(CC) $(INCLUDE) -o $(WSNAME)server $(SERVER_OBJS)
client: $(CLIENT_OBJS)
$(CC) $(INCLUDE) -o $(WSNAME)test $(CLIENT_OBJS)
clean:
rm -f *.o $(WSNAME)server $(WSNAME)test
其中
GSOAP_ROOT 为你下载的gsoap源码路径
G、编译执行
./addserver 9000;
./addtest 192.168.1.42:9000 111 222
执行结果为 server is 192.168.1.42:9000, num1 is 111, num2 is 222/n111 + 222 = 333
源码下载路径:http://download.youkuaiyun.com/detail/lishuanglin131/4750696