onvif 笔记一(gsoap)

来源:互联网 发布:按键精灵数组输出 编辑:程序博客网 时间:2024/04/29 15:03

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/gsoapWSNAME = addCC = g++ -g -DWITH_NONAMESPACESINCLUDE = -I$(GSOAP_ROOT)SERVER_OBJS = soapC.o stdsoap2.o soapServer.o $(WSNAME)server.oCLIENT_OBJS = soapC.o stdsoap2.o soapClient.o $(WSNAME)client.o $(WSNAME)test.oall: server clientserver: $(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.csdn.net/detail/lishuanglin131/4750696


原创粉丝点击