轉載自博文: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