天天看點

linux下使用gSOAP建立SOAP調用執行個體

轉載自博文:http://blog.csdn.net/ghostyu/article/details/8162280

1.下載下傳安裝gSOAP

2.我們不使用WSDL生成頭檔案,直接自己編寫頭檔案,用來定義接口函數,命名為add.h

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

3.根據.h檔案,執行指令,自動生成一些遠端調用需要的檔案

soapcpp2 -c add.h

4.生成了很多檔案,此時可以自己編寫添加服務端代碼,建立檔案:addserver.c

#include "soapH.h"  
#include "ns2.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 < ) {  
        printf("usage: %s <server_port> \n", argv[]);  
        exit();  
    } else {  
        m = soap_bind(&add_soap, NULL, atoi(argv[]), );  
        if (m < ) {  
            soap_print_fault(&add_soap, stderr);  
            exit(-);  
        }  
        fprintf(stderr, "Socket connection successful: master socket = %d\n", m);  
        for (;;) {  
            s = soap_accept(&add_soap);  
            if (s < ) {  
                soap_print_fault(&add_soap, stderr);  
                exit(-);  
            }  
            fprintf(stderr, "Socket connection successful: slave socket = %d\n", s);  
            soap_serve(&add_soap);  
            soap_end(&add_soap);  
        }  
    }  
    return ;  
}  
#if 1  
int ns2__add(struct soap *add_soap, int num1, int num2, int *sum)  
{  
    *sum = num1 + num2;  
    return ;  
}  
#endif  
           

5.添加用戶端代碼,建立檔案:addclient.c

#include "soapStub.h"
#include "ns2.nsmap"

int add(const char *server, int num1, int num2, int *sum)
{
    struct soap add_soap;
    int result = ;
    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;
}
           

6.寫用戶端測試代碼,建立檔案: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 = -;  
    char server[] = {};  
    int num1;  
    int num2;  
    int sum;  

    if (argc < ) {  
        printf("usage: %s <ip:port> num1 num2 \n", argv[]);  
        exit();  
    }  

    strcpy(server,argv[]);  
    num1 = atoi(argv[]);  
    num2 = atoi(argv[]);  
    result = add(server, num1, num2,&sum);  

    if (result != ) {  
        printf("soap error, errcode=%d\n", result);  
    } else {  
        printf("%d + %d = %d\n", num1, num2, sum);  
    }  
    return ;  
}  
           

7.編寫Makefile,對代碼進行編譯(注意縮進要用Tab,否則會報錯)

GSOAP_ROOT = /root/onvif/gsoap-/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  
           

8.将gsoap-2.8\gsoap目錄下的stdsoap2.c和stdsoap2.h複制到目前目錄下,它提供了對SOAP協定的簡單調用。編譯服務端make server得到addserver,編譯用戶端make client 得到addtest

9.運作測試:

./addserver 1234

./addtest 192.168.1.106:1234 10 20

linux下使用gSOAP建立SOAP調用執行個體
linux下使用gSOAP建立SOAP調用執行個體

繼續閱讀