zoukankan      html  css  js  c++  java
  • 〖Linux〗使用gsoap搭建web server(C)

    1. gsoap的好处就不用说了:百度百科

    2. gsoap的下载地址:项目地址,目前我使用的是2.8.15版本

    3. 开发环境:Ubuntu13.10

    4. 具体操作步骤(以简单相加为例):

      1) 编写add.h(头文件)

    //gsoap ns service name: calc
    //gsoap ns service protocol: SOAP
    //gsoap ns service style: rpc
    //gsoap ns service encoding: encoded
    //gsoap ns service namespace:    http://localhost:8888
    //gsoap ns service location:    http://localhost:8888
    //gsoap ns service port:    http://localhost:8888
     
    int ns__add( int num1, int num2, int* sum );

      2) 编写addserver.c(服务器)

    #include "soapH.h"
    #include "calc.nsmap"                           /* 与add.h的第一行命名空间(ns)有关 */
    #include <stdio.h>
    #include <stdlib.h>
    int
    main (int argc, char *argv[])
    {
      int m, s;
      struct soap add_soap;
      soap_init (&add_soap);
      if (argc < 2)
        {
          printf ("usage: %s <server_port> 
    ", 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
    ",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
    ", s);
          soap_serve (&add_soap);    //该句说明该server的服务
          soap_end (&add_soap);
        }
        }
      return 0;
    }
    
    int
    ns__add (struct soap *add_soap, int num1, int num2, int *sum)
    {
      *sum = num1 + num2;
      return 0;
    }

      3) 编写addclient.c(客户端)

    #include "soapH.h"
    #include "calc.nsmap"                           /* 与add.h的第一行命名空间(ns)有关 */
    #include <stdio.h>
    #include <stdlib.h>
    
    int add (const char *server, int num1, int num2, int *sum);
    
    int
    main (int argc, char **argv)
    {
      int result = -1;
      char *server = "http://localhost:4567";       /* 定义server */
      int num1 = 0;
      int num2 = 0;
      int sum = 0;
      if (argc < 3)                                 /* 判断传入参数 */
        {
          printf ("usage: %s num1 num2 
    ", argv[0]);
          exit (0);
        }
      num1 = atoi (argv[1]);
      num2 = atoi (argv[2]);
      result = add (server, num1, num2, &sum);      /* 执行add() */
      if (result != 0)                              /* 输出result */
        {
          printf ("soap err,errcode = %d
    ", result);
        }
      else
        {
          printf ("%d+%d=%d
    ", num1, num2, sum);
        }
      return 0;
    }
    
    int
    add (const char *server, int num1, int num2, int *sum)
    {
      struct soap add_soap;                         /* 创建add_soap()结构体 */
      int result = 0;
      soap_init (&add_soap);                        /* soap_init()*/
      soap_call_ns__add (&add_soap, server, "", num1, num2, sum); /* 调用soap_call_ns_add() */
      if (add_soap.error)
        {
          printf ("soap error:%d,%s,%s
    ", 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;
    }

      4) 编写Makefile文件

    # this is a Makefile to build client and server
    # please setting the GSOAP_ROOT first.
    # build procedure:
    #     step1: make soap
    #     step2: make all
    
    OBJ_NS := calc
    OBJ_NAME := add
    GSOAP_ROOT := /home/scue/work/gsoap_2.8.15/gsoap
    INCLUDE := -I$(GSOAP_ROOT)
    
    CC := clang
    GCC := clang
    #CC := arm-linux-gcc
    #GCC := arm-linux-gcc
    
    OBJ_SERVER := soapC.o stdsoap2.o soapServer.o $(OBJ_NAME)server.o
    OBJ_CLIENT := soapC.o stdsoap2.o soapClient.o $(OBJ_NAME)client.o
    
    all: server client 
    
    server: $(OBJ_SERVER)
        $(CC) $(INCLUDE) $^ -o $@
    client: $(OBJ_CLIENT)
        $(CC) $(INCLUDE) $^ -o $@
    
    .PHONY:soap
    soap:
        @cp -v $(GSOAP_ROOT)/stdsoap2.* .
        @$(GSOAP_ROOT)/bin/linux386/soapcpp2 -c $(OBJ_NAME).h
    # -c 表示生成c文件
    
    .PHONY:clean
    clean:
        rm -f server client *.o
    distclean:
        rm -f server client *.o ns* soap* *.xml *.nsmap *.wsdl stdsoap2.*

      5) 编译及验证

    make soap && make
    ./server 4567
    ./client 2 3 #将会返回5,也可以直接在浏览器中输入http://localhost:4567进行验证

     参考文章:

      1.http://blog.csdn.net/wesleyluo/article/details/5532633

  • 相关阅读:
    UVALive 6909 Kevin's Problem 数学排列组合
    UVALive 6908 Electric Bike dp
    UVALive 6907 Body Building tarjan
    UVALive 6906 Cluster Analysis 并查集
    八月微博
    hdu 5784 How Many Triangles 计算几何,平面有多少个锐角三角形
    hdu 5792 World is Exploding 树状数组
    hdu 5791 Two dp
    hdu 5787 K-wolf Number 数位dp
    hdu 5783 Divide the Sequence 贪心
  • 原文地址:https://www.cnblogs.com/scue/p/3402360.html
Copyright © 2011-2022 走看看