您的位置:首页 > 运维架构 > Linux

Linux 平台gsoap简单使用

2017-04-08 15:21 155 查看
gsoap下载地址:https://sourceforge.net/projects/gsoap2/?source=typ_redirect

1、编译生成soapcpp2

下载解压之后 跳转gsoap-2.8 目录,执行

./configure

cd gsoap/  执行 make

会在src目录下生成soapcpp2

2、创建test目录

新建add.h 头文件 内容如下

int ns2__add( int num1, int num2, int* sum );

cd test

然后我们执行../src/soapcpp2 -c add.h,自动生成一些远程调用需要的文件。如下所示:



接下来我们写一个服务端,创建文件addserver.c,内容如下:

#include "soapH.h"

#include "add.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\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);

            soap_end(&add_soap);

        }

    }

    return 0;

}

int ns2__add(struct soap *add_soap, int num1, int num2, int *sum)

{

    *sum = num1 + num2;

    return 0;

}

我们接着写客户端,文件addclient.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "soapStub.h"

#include "add.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_ns2__add(&add_soap, server, NULL, num1, num2, sum);

    printf("server is %s, num1 is %d, num2 is %d\n", server, num1, num2);

    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;

}

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 \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\n", result);

    } else {

        printf("%d + %d = %d\n", num1, num2, sum);

    }

    return 0;

}

Makefile 文件,注意格式,命令行要以table开始

GSOAP_ROOT = /home/mint/my_work/gsoap/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)cliento

all: server

server: $(SERVER_OBJS) 
$(CC) $(INCLUDE) -o $(WSNAME)server $(SERVER_OBJS) 

client: $(CLIENT_OBJS) 
$(CC) $(INCLUDE) -o $(WSNAME)client $(CLIENT_OBJS)

cl:
rm -f *.o *.xml *.a *.wsdl *.nsmap soapH.h $(WSNAME)Stub.* $(WSNAME)server ns.xsd $(WSNAME)test

注意:编译的时候我们需要gsoap包里的源代码文件,把上层目录下的stdsoap2.c和stdsoap2.h文件拷贝到当前目录

然后我们执行make,即可生产addserver程序;make client,生成addclient程序。

让server跑起来,执行./addserver 6666



终端打印出“Socket connection successful: master socket = 3”,那么你的server已经在前台run起来了;
运行客户端,./addclient ip:port num1 num2,返回加法的结果。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: