linux下gsoap的加法程序

这里补充一句在Fedora14上安装gsoap2-8的时候会有错误(而在F12上直接configure,make,make install就好了),载configure之后再./makemake一下,然后在make和make install

头文件的第六行写上服务器的ip,在本机上调试的时候可以写环回地址//gsoap ns2 service port:http://127.0.0.1

  • 对gsoap的简单介绍,请自己参阅http://gsoap2.sourceforge.net/
    下载相应的包,主要有2个工具和源代码:
    wsdl2h -o outfile.h infile.wsdl 实现wsdl文件到h文件的数据映射
        soapcpp2 -c outfile.h生成相应的底层通信stub,strech程序
  • 下面这个简单的例子实现的是在客户端输入2个数字,然后远程调用服务端的加法函数,最后返回结果给客户端。
    在这里我们不需要wsdl的文件,可以直接从.h文件来生成代码。我们定义一个函数声明文件,用来定义接口函数,名称为add.h,内容如下:
       1. //gsoapopt cw
       2. //gsoap ns2 schema namespace: urn:add
       3. //gsoap ns2 schema form: unqualified
       4. //gsoap ns2 service name: add
       5. //gsoap ns2 service type: addPortType
       6. //gsoap ns2 service port:http://websrv.cs.fsu.edu/~engelen/addserver.cgi
       7. //gsoap ns2 service namespace: urn:add
       8. //gsoap ns2 service transport: http://schemas.xmlsoap.org/soap/http
       9. //gsoap ns2  service method-style:      add rpc
      10. //gsoap ns2  service method-encoding:  add http://schemas.xmlsoap.org/soap/encoding/
      11. //gsoap ns2  service method-action:     add ""
      12. int ns2__add( int num1, int num2, int* sum );


然后我们执行soapcpp2 -c add.h,自动生成一些远程调用需要的文件。
接下来我们写一个服务端,创建文件addserver.c
       1. #include "soapH.h"
       2. #include "add.nsmap"
       3.

       4. int main(int argc, char **argv)
       5. {
       6.     int m, s;
       7.     struct soap add_soap;
       8.     soap_init(&add_soap);
       9.     soap_set_namespaces(&add_soap, namespaces);
      10.

      11.     if (argc < 2) {
      12.         printf("usage: %s <server_port> /n", argv[0]);
      13.         exit(1);
      14.     } else {
      15.         m = soap_bind(&add_soap, NULL, atoi(argv[1]), 100);
      16.         if (m < 0) {
      17.             soap_print_fault(&add_soap, stderr);
      18.             exit(-1);
      19.         }
      20.         fprintf(stderr, "Socket connection successful: master socket = %d/n", m);
      21.         for (;;) {
      22.             s = soap_accept(&add_soap);
      23.             if (s < 0) {
      24.                 soap_print_fault(&add_soap, stderr);
      25.                 exit(-1);
      26.             }
      27.             fprintf(stderr, "Socket connection successful: slave socket = %d/n", s);
      28.             soap_serve(&add_soap);
      29.             soap_end(&add_soap);
      30.         }
      31.     }
      32.     return 0;
      33. }
      34.

      35. int ns2__add(struct soap *add_soap, int num1, int num2, int *sum)
      36. {
      37.     *sum = num1 + num2;
      38.     return 0;
      39. }


我们接着写客户端,文件addclient.c
   1. #include "soapStub.h"
   2. #include "add.nsmap"
   3.

   4. int add(const char *server, int num1, int num2, int *sum)
   5. {
   6.     struct soap add_soap;
   7.     int result = 0;
   8.     soap_init(&add_soap);
   9.     soap_set_namespaces(&add_soap, namespaces);
  10.     soap_call_ns2__add(&add_soap, server, NULL, num1, num2, sum);
  11.     printf("server is %s, num1 is %d, num2 is %d/n", server, num1, num2);
  12.

  13.     if (add_soap.error) {
  14.         printf("soap error: %d, %s, %s/n", add_soap.error, *soap_faultcode(&add_soap), *soap_faultstring(&add_soap));
  15.         result = add_soap.error;
  16.     }
  17.     soap_end(&add_soap);
  18.     soap_done(&add_soap);
  19.     return result;
  20. }


最后写一个测试代码,addtest.c
   1. #include <stdio.h>
   2. #include <stdlib.h>
   3. #include <string.h>
   4.

   5. int add(const char *server, int num1, int num2, int *sum);
   6. int main(int argc, char **argv)
   7. {
   8.     int result = -1;
   9.     char server[128] = {0};
  10.     int num1;
  11.     int num2;
  12.     int sum;
  13.

  14.     if (argc < 4) {
  15.         printf("usage: %s <ip:port> num1 num2 /n", argv[0]);
  16.         exit(1);
  17.     }
  18.

  19.     strcpy(server,argv[1]);
  20.     num1 = atoi(argv[2]);
  21.     num2 = atoi(argv[3]);
  22.     result = add(server, num1, num2, ∑);
  23.

  24.     if (result != 0) {
  25.         printf("soap error, errcode=%d/n", result);
  26.     } else {
  27.         printf("%d + %d = %d/n", num1, num2, sum);
  28.     }
  29.     return 0;
  30. }

到此为止,我们自己的代码已经编写完毕,现在我们来编译服务端和客户端
注意:编译的时候我们需要gsoap包里的源代码文件,把stdsoap2.c和stdsoap2.h文件拷贝到当前目录
我们写一个Makefile文件:
   1. GSOAP_ROOT = /root/gsoap-2.7/gsoap
   2. WSNAME = add
   3. CC = g++ -g -DWITH_NONAMESPACES
   4. INCLUDE = -I$(GSOAP_ROOT)
   5. SERVER_OBJS = soapC.o stdsoap2.o soapServer.o $(WSNAME)server.o 
   6. CLIENT_OBJS = soapC.o stdsoap2.o soapClient.o $(WSNAME)client.o $(WSNAME)test.o
   7.

   8. all: server
   9. server: $(SERVER_OBJS) 
  10.     $(CC) $(INCLUDE) -o $(WSNAME)server $(SERVER_OBJS) 
  11.

  12. client: $(CLIENT_OBJS) 
  13.     $(CC) $(INCLUDE) -o $(WSNAME)test $(CLIENT_OBJS)
  14.

  15. cl:
  16.     rm -f *.o *.xml *.a *.wsdl *.nsmap soapH.h $(WSNAME)Stub.* $(WSNAME)server ns.xsd $(WSNAME)test


然后我们执行make,即可生产addserver程序;make client,生成addtest程序。
让server跑起来,执行./addserver 6666
终端打印出“Socket connection successful: master socket = 3”,那么你的server已经在前台run起来了;
运行客户端,./addtest ip:port num1 num2,返回加法的结果。
OK,一个最简单的soap调用的例子完成了,进深一步的学习请参考http://gsoap2.sourceforge.net/

你可能感兴趣的:(linux,server,service,SOAP,NameSpaces)