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

  • 相关阅读:
    Munge
    file upload custom form
    随笔摘要
    生成css 和 清缓存
    drupal commit 原则
    Git reset --hard
    www-data
    301/302的区别
    什么是request_uri
    in_array foreach array_search的性能比较
  • 原文地址:https://www.cnblogs.com/scue/p/3402360.html
Copyright © 2011-2022 走看看