Linux 环境下 Gsoap webservice C程序编写

初次学习,主要参考https://blog.youkuaiyun.com/jinpw/article/details/3346844

因为上篇文章中有一些细节上的错误,综合评论上的修改,可完成操作。



1、选择好一个目录,在目录下新建一个add.h

//gsoapopt cw
//gsoap ns2 schema namespace: urn:add
//gsoap ns2 schema form: unqualified
//gsoap ns2 service name: add
//gsoap ns2 service type: addPortType
//gsoap ns2 service port:http://websrv.cs.fsu.edu/~engelen/addserver.cgi
//gsoap ns2 service namespace: urn:add
//gsoap ns2 service transport: http://schemas.xmlsoap.org/soap/http
//gsoap ns2  service method-style:      add rpc
//gsoap ns2  service method-encoding:   add http://schemas.xmlsoap.org/soap/encoding/
//gsoap ns2  service method-action:     add ""

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


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



2、新建服务端程序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;
}



3、新建客户端程序:addclient.c

#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;
}




4、新建一个测试段的代码: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 /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;
}




5、到此为止,我们自己的代码已经编写完毕,现在我们来编译服务端和客户端
注意:编译的时候我们需要gsoap包里的源代码文件,把stdsoap2.c和stdsoap2.h文件拷贝到当前目录

我们写一个Makefile文件:

GSOAP_ROOT = /usr/local/share/gsoap

#GSOAP_ROOT = /home/zmz/zmz/webservice/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
server: $(SERVER_OBJS)
        $(CC) $(INCLUDE) -o $(WSNAME)server $(SERVER_OBJS) 

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

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



注意:

1、GSOAP_ROOT: 这个环境变量我填写的是我文件gsoap的地址

2、server: $(SERVER_OBJS)

client: $(CLIENT_OBJS)

cl:

这三排后面的那一行需要添加一个TAB,可能因为格式的原因,编辑器中使用的是四个空格,所以需要将四个空格修改成TAB



6、运行

(1)make,即可生产addserver程序

(2)make client,生成addtest程序。

(3)./addserver 6666(6666为服务端设置的端口号)

出现此打印意味着已经成功:"Socket connection successful: master socket = 3”

(4)因为步骤3运行了之后,一直在等待连接,所以我又重新使用了另一个窗口运行client:

./addtest ip:port num1 num2        (./addtest 127.0.0.1:6666 3 5)






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值