onvif 笔记一(gsoap)

这篇博客介绍了如何利用gSOAP库根据头文件生成相关文件,以实现客户端和服务端的加法函数远程调用。通过编写头文件、执行soapcpp2命令,创建服务端程序并测试,展示了gSOAP在实际应用中的基本步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、gsoap编译很简单

./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;
}


D、编写客户端程序:addclient.c

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


F、编写makefile

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


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值