onvif学习之gsoap简单实例

本文介绍了如何使用gSOAP库创建SOAP调用实例,包括设置环境变量、生成C代码、完成DEMO代码实现等步骤,并解决了编译过程中的错误,最终成功构建了服务器和客户端。

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

  以下内容是来自网上,加上自己的试验得来,不能算原创,这里要感谢onvif规范的实现:使用gSOAP创建SOAP调用实例”的作者!

http://blog.youkuaiyun.com/ghostyu/article/details/8162280这个是我在网上找到的,这个应该是原文出处吧!在这里再次感谢作者!

1,设置环境变量,这里我写了一个脚本,直接执行脚本就能直接配置环境变量:

root@microcreat:/workdir/private/onvif/workdir/demo# cat ../../setenv
#!/bin/sbin/

echo "set the environment for gsoap.....!"

GSOAP_PATH=$PWD/gsoap_install/bin/

export PATH=$GSOAP_PATH:$PATH

设置好后,直接执行

root@microcreat:/workdir/private/onvif# . setenv
set the environment for gsoap.....!
这样就设置好环境变量了。

2,根据头文件生成c代码:

  首先需要一个x.h文件,这个文件我是抄的网上的:

 root@microcreat:/workdir/private/onvif/workdir/demo# cat add.h
int ns2__add( int num1, int num2, int* sum );

  然后生成c代码:

root@microcreat:/workdir/private/onvif/workdir/demo# pwd
/workdir/private/onvif/workdir/demo
root@microcreat:/workdir/private/onvif/workdir/demo# ls
add.h
root@microcreat:/workdir/private/onvif/workdir/demo# soapcpp2 -c add.h

**  The gSOAP code generator for C and C++, soapcpp2 release 2.8.12
**  Copyright (C) 2000-2012, Robert van Engelen, Genivia Inc.
**  All Rights Reserved. This product is provided "as is", without any warranty.
**  The soapcpp2 tool is released under one of the following two licenses:
**  GPL or the commercial license by Genivia Inc.

Saving soapStub.h annotated copy of the input declarations
Using ns2 service name: Service
Using ns2 service style: document
Using ns2 service encoding: literal
Using ns2 service location: http://localhost:80
Using ns2 schema namespace: http://tempuri.org/ns2.xsd
Saving ns2.wsdl Web Service description
Saving ns2.add.req.xml sample SOAP/XML request
Saving ns2.add.res.xml sample SOAP/XML response
Saving ns2.xsd XML schema
Saving ns2.nsmap namespace mapping table
Saving soapClient.c client calling stubs
Saving soapClientLib.c client stubs with serializers (use only for libs)
Saving soapServer.c server request dispatcher
Saving soapServerLib.c server request dispatcher with serializers (use only for libs)
Saving soapH.h interface declarations
Saving soapC.c XML serializers

Compilation successful

root@microcreat:/workdir/private/onvif/workdir/demo# ls
add.h            ns2.add.res.xml  ns2.wsdl  soapC.c       soapClientLib.c  soapServer.c    soapStub.h
ns2.add.req.xml  ns2.nsmap        ns2.xsd   soapClient.c  soapH.h          soapServerLib.c
  可以看到生成了很多c代码,这样框架代码就生成了。

3,下面我们来完成DEMO代码:

  3.1 addserver.c

root@microcreat:/workdir/private/onvif/workdir/demo# cat 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;  
 
#if 1  
int ns2__add(struct soap *add_soap, int num1, int num2, int *sum)  
 
    *sum = num1 + num2;  
    return 0;  
 
#endif
  3.2 addclient.c

root@microcreat:/workdir/private/onvif/workdir/demo# cat 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;  

  3.3 addtest.c

root@microcreat:/workdir/private/onvif/workdir/demo# cat 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;  

  3.4 Makefile文件

root@microcreat:/workdir/private/onvif/workdir/demo# cat Makefile
GSOAP_ROOT = /workdir/private/onvif/gsoap-2.8/gsoap  
CC = gcc -g -DWITH_NONAMESPACES  
INCLUDE = -I$(GSOAP_ROOT)  
SERVER_OBJS = soapC.o stdsoap2.o soapServer.o addserver.o   
CLIENT_OBJS = soapC.o stdsoap2.o soapClient.o addclient.o addtest.o  
 
all: server  
server: $(SERVER_OBJS)   
 $(CC) $(INCLUDE) -o addserver $(SERVER_OBJS)   
 
client: $(CLIENT_OBJS)   
 $(CC) $(INCLUDE) -o addtest $(CLIENT_OBJS)  

clean:  
 rm -f *.o addtest

4,完成后开始编译

root@microcreat:/workdir/private/onvif/workdir/demo# make server
gcc -g -DWITH_NONAMESPACES       -c -o soapC.o soapC.c
In file included from soapH.h:13:0,
                 from soapC.c:16:
soapStub.h:13:22: fatal error: stdsoap2.h: No such file or directory
compilation terminated.
make: *** [soapC.o] Error 1

编译的时候出现上面的错误!

解决办法:将缺少文件复制到工作路径来:

root@microcreat:/workdir/private/onvif/workdir/demo# pwd
/workdir/private/onvif/workdir/demo
root@microcreat:/workdir/private/onvif/workdir/demo# cp -af /workdir/private/onvif/gsoap_install/include/stdsoap2.h .
root@microcreat:/workdir/private/onvif/workdir/demo# cp -af /workdir/private/onvif/gsoap-2.8/gsoap/stdsoap2.c .

 然后重新编译:

root@microcreat:/workdir/private/onvif/workdir/demo# make server
gcc -g -DWITH_NONAMESPACES       -c -o stdsoap2.o stdsoap2.c
gcc -g -DWITH_NONAMESPACES       -c -o soapServer.o soapServer.c
gcc -g -DWITH_NONAMESPACES       -c -o addserver.o addserver.c
addserver.c:2:24: fatal error: add.nsmap: No such file or directory
compilation terminated.
make: *** [addserver.o] Error 1

解决办法:

  修改addserver.c和addclient.c文件:把"#include "add.nsmap""改为"#include "ns2.nsmap""

最后编译:

root@microcreat:/workdir/private/onvif/workdir/demo# make server
gcc -g -DWITH_NONAMESPACES       -c -o soapC.o soapC.c
gcc -g -DWITH_NONAMESPACES       -c -o stdsoap2.o stdsoap2.c
gcc -g -DWITH_NONAMESPACES       -c -o soapServer.o soapServer.c
gcc -g -DWITH_NONAMESPACES       -c -o addserver.o addserver.c
gcc -g -DWITH_NONAMESPACES    -I/workdir/private/onvif/gsoap_install/include    -o addserver soapC.o stdsoap2.o soapServer.o addserver.o       
root@microcreat:/workdir/private/onvif/workdir/demo# make client
gcc -g -DWITH_NONAMESPACES       -c -o soapClient.o soapClient.c
gcc -g -DWITH_NONAMESPACES       -c -o addclient.o addclient.c
gcc -g -DWITH_NONAMESPACES       -c -o addtest.o addtest.c
gcc -g -DWITH_NONAMESPACES    -I/workdir/private/onvif/gsoap_install/include    -o addtest soapC.o stdsoap2.o soapClient.o addclient.o addtest.o     
root@microcreat:/workdir/private/onvif/workdir/demo# ls
addclient.c  addserver    addtest    Makefile         ns2.nsmap  soapC.c          soapClient.o soapServer.c     soapStub.h  stdsoap2.o
addclient.o  addserver.c  addtest.c  ns2.add.req.xml  ns2.wsdl   soapClient.c     soapC.o      soapServerLib.c  stdsoap2.c
add.h        addserver.o  addtest.o  ns2.add.res.xml  ns2.xsd    soapClientLib.c  soapH.h      soapServer.o     stdsoap2.h

这样就编译成功:

下面是测试截图:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值