1. 程式人生 > >linux基礎學習之 gsoap calc 例程(2)

linux基礎學習之 gsoap calc 例程(2)

我把例程裡面的README.txt翻譯了一下

程式也就一目瞭然了,但是因為makefile是automake生成的,那部分還每搞清楚。

Simple calculator service implements:


   add(a,b)
   sub(a,b)
   mul(a,b)
   div(a,b)
   pow(a,b)


Compilation in C (see samples/calc):
    soapcpp2 -c calc.h
    cc -o calcclient calcclient.c stdsoap2.c soapC.c soapClient.c
    cc -o calcserver calcserver.c stdsoap2.c soapC.c soapServer.c




For C++ development soapcpp2 option -i generates proxy and service classes,
which encapsulate the method operations in the class instead of defining them
as global functions as in C.


The calcclient application invokes the service and is used from the command
line as follows:


$ calcclient add 3 4-
result = 7


calcserver 應用程式是一個CGI(公共閘道器介面)應用程式可以在你的web 服務目錄下建立


C語言的客戶端用到了:


初始化執行引擎:
soap_init(struct soap*)


呼叫XYZ,這個函式是soapcpp2生成的:
soap_call_ns__xyz(struct soap*, const char *endpoint, const char *action,
                      double a, double b, double *result)


Note: endpoint=NULL and action=NULL for defaults


列印通訊錯誤:
soap_print_fault(struct soap*, FILE*)


分配資料,保持可用狀態(alive)指導被soap_end釋放
soap_malloc(struct soap*, size_t len)


刪除反序列資料
soap_end(struct soap*)


完成和分離執行引擎
soap_done(struct soap*)




C語言伺服器端用到:


初始化執行引擎
soap_init(struct soap*)


繫結埠:
soap_bind(struct soap*, const char *host, int port, int backlog)


接收一個請求:
soap_accept(struct soap*);


呼叫服務排程程式,這個函式是soapcpp2生成的
soap_serve(struct soap*)


列印通訊錯誤
soap_print_fault(struct soap*, FILE*)


分配資料,保持可用狀態(alive)指導被soap_end釋放
soap_malloc(struct soap*, size_t len)


刪除反序列資料
soap_end(struct soap*)


發回sender-related 錯誤
soap_sender_fault(struct soap*, const char *string, const char *detailXML)


發回receiver-related錯誤
soap_receiver_fault(struct soap*, const char *string, const char *detailXML)


完成和分離執行引擎
soap_done(struct soap*)




服務操作不是自動生成的(使用已定義的)
ns__add(struct soap*, double a, double b, double *result)
    ns__sub(struct soap*, double a, double b, double *result)
   ns__mul(struct soap*, double a, double b, double *result)
    ns__div(struct soap*, double a, double b, double *result)
    ns__pow(struct soap*, double a, double b, double *result)

calc.h

//gsoap ns service name:	calc Simple calculator service described at http://www.genivia.com/dev.html
//gsoap ns service protocol:	SOAP
//gsoap ns service style:	rpc
//gsoap ns service encoding:	encoded
//gsoap ns service namespace:	http://websrv.cs.fsu.edu/~engelen/calc.wsdl
//gsoap ns service location:	http://websrv.cs.fsu.edu/~engelen/calcserver.cgi

//gsoap ns schema namespace:	urn:calc

//gsoap ns service method: add Sums two values
int ns__add(double a, double b, double *result);

//gsoap ns service method: sub Subtracts two values
int ns__sub(double a, double b, double *result);

//gsoap ns service method: mul Multiplies two values
int ns__mul(double a, double b, double *result);

//gsoap ns service method: div Divides two values
int ns__div(double a, double b, double *result);

//gsoap ns service method: pow Raises a to b
int ns__pow(double a, double b, double *result);

calcclient.c
#include "soapH.h"
#include "calc.nsmap"

const char server[] = "http://websrv.cs.fsu.edu/~engelen/calcserver.cgi";
/* = "http://localhost:8080"; to test against samples/webserver */

int main(int argc, char **argv)
{ struct soap soap;
  double a, b, result;
  if (argc < 4)
  { fprintf(stderr, "Usage: [add|sub|mul|div|pow] num num\n");
    exit(0);
  }
  soap_init1(&soap, SOAP_XML_INDENT);
  a = strtod(argv[2], NULL);
  b = strtod(argv[3], NULL);
  switch (*argv[1])
  { case 'a':
      soap_call_ns__add(&soap, server, "", a, b, &result);
      break;
    case 's':
      soap_call_ns__sub(&soap, server, "", a, b, &result);
      break;
    case 'm':
      soap_call_ns__mul(&soap, server, "", a, b, &result);
      break;
    case 'd':
      soap_call_ns__div(&soap, server, "", a, b, &result);
      break;
    case 'p':
      soap_call_ns__pow(&soap, server, "", a, b, &result);
      break;
    default:
      fprintf(stderr, "Unknown command\n");
      exit(0);
  }
  if (soap.error)
  { soap_print_fault(&soap, stderr);
    exit(1);
  }
  else
    printf("result = %g\n", result);
  soap_destroy(&soap);
  soap_end(&soap);
  soap_done(&soap);
  return 0;
}

calcserver.c
#include "soapH.h"
#include "calc.nsmap"

int main(int argc, char **argv)
{ SOAP_SOCKET m, s; /* master and slave sockets */
  struct soap soap;
  soap_init(&soap);
  if (argc < 2)
    soap_serve(&soap);	/* serve as CGI application */
  else
  { m = soap_bind(&soap, NULL, atoi(argv[1]), 100);
    if (!soap_valid_socket(m))
    { soap_print_fault(&soap, stderr);
      exit(-1);
    }
    fprintf(stderr, "Socket connection successful: master socket = %d\n", m);
    for ( ; ; )
    { s = soap_accept(&soap);
      fprintf(stderr, "Socket connection successful: slave socket = %d\n", s);
      if (!soap_valid_socket(s))
      { soap_print_fault(&soap, stderr);
        exit(-1);
      } 
      soap_serve(&soap);
      soap_end(&soap);
    }
  }
  return 0;
} 

int ns__add(struct soap *soap, double a, double b, double *result)
{ (void)soap;
  *result = a + b;
  return SOAP_OK;
} 

int ns__sub(struct soap *soap, double a, double b, double *result)
{ (void)soap;
  *result = a - b;
  return SOAP_OK;
} 

int ns__mul(struct soap *soap, double a, double b, double *result)
{ (void)soap;
  *result = a * b;
  return SOAP_OK;
} 

int ns__div(struct soap *soap, double a, double b, double *result)
{ if (b)
    *result = a / b;
  else
  { char *s = (char*)soap_malloc(soap, 1024);
    (SOAP_SNPRINTF(s, 1024, 100), "<error xmlns=\"http://tempuri.org/\">Can't divide %f by %f</error>", a, b);
    return soap_sender_fault(soap, "Division by zero", s);
  }
  return SOAP_OK;
} 

int ns__pow(struct soap *soap, double a, double b, double *result)
{ *result = pow(a, b);
  if (soap_errno == EDOM)	/* soap_errno is like errno, but compatible with Win32 */
  { char *s = (char*)soap_malloc(soap, 1024);
    (SOAP_SNPRINTF(s, 1024, 100), "<error xmlns=\"http://tempuri.org/\">Can't raise %f to %f</error>", a, b);
    return soap_sender_fault(soap, "Power function domain error", s);
  }
  return SOAP_OK;
} 



相關推薦

linux基礎學習 gsoap calc 2

我把例程裡面的README.txt翻譯了一下 程式也就一目瞭然了,但是因為makefile是automake生成的,那部分還每搞清楚。 Simple calculator service implements:    add(a,b)    sub(a,b)    m

MQTT的學習Mosquitto發布-訂閱2

creat 訂閱模式 pub 測試 方法 ssa clientm art ble 在《MQTT的學習之Mosquitto安裝&使用(1)》一文末尾,我已經模擬了發布-訂閱模式,只是那時在服務器直接模擬的,並不是java代碼模擬的。下面貼出Java代碼 1、首先引入依

深度學習正則化系列2:資料集增強資料增廣

讓機器學習模型泛化得更好的最好辦法是使用更多的資料進行訓練。當然,在實踐中,我們擁有的資料量是很有限的。解決這個問題的一種方法是建立假資料並新增到訓練集中。對於一些機器學習任務,建立新的假資料相當簡單。對分類來說這種方法是最簡單的。分類器需要一個複雜的高維輸入

linux基礎學習軟體安裝以及常用命令

  linux基礎學習之軟體安裝以及常用命令 呼叫中央倉庫: yum install wget     然後下載nodejs: wget https://nodejs.org/dist/v10.14.2/node-v10.14.2-

linux基礎學習軟體安裝以及常用命令

    新增和檢視使用者: [[email protected] ~]# useradd anderson [[email protected] ~]# cat /etc/passwd 顯示如下: [[email protected

Linux基礎學習Shell基礎——環境變數配置檔案

1、什麼是環境變數呢? 可以在父shell和子shell中都能呼叫的就是環境變數,只能在本shell中使用的變數就是普通的變數。 2、什麼是環境變數配置檔案呢? linux 中所有需要永久生效的內容,都必須寫入配置檔案中;同樣,對於環境變數,想要在系統重啟 或者其他情況下,讓該環

Linux基礎學習Shell基礎——Bash變數——預定義變數

1、預定義變數 預定義變數 作用 $? 最後一次執行的命令的返回狀態。如果這個變數的值為,證明上一個命令正確執行;如果這個變數的值為非0(具體是哪個數,由命令自己來決定),則證明上一個命令執行不正確了。

Linux基礎學習Shell程式設計——字元擷取命令相關——printf、cut、awk、sed

  一、字元擷取命令之cut命令 1、字元擷取命令有哪些? grep  cut    printf(嚴格來說不算)   awk   sed  命令 2、grep 是在檔案當中提取符合條件的行  

linux基礎學習圖形介面與命令列介面切換

首先,開機時進入到LINUX的圖形介面 緊接著,選中左上角的Applications----system tools-----terminal 選項 注意,使用者必須為ROOT,具備最高許可權

linux基礎學習 學習筆記

Linux是什麼 1、 linux的核心原型是1991年由託瓦茲(Linus Torvalds)寫出來的。 2、 1973年:unix的正式誕生,Ritchie等人以C語言寫出第一個正式unix核心。 3、 1977年:重要的unix分支——BSD(Berkeley Sof

linux基礎學習各目錄的作用

尼瑪哥經常在linux當中使用各種目錄,但是,才發現,自己並不是很瞭解各個目錄的含義,所以,為了讓尼瑪哥能夠對自己所操作的目錄有所瞭解,尼瑪哥在網上查找了相關的知識,接下來,分享給大家瞧瞧看看,在使用linux之前,可以先了解一下自己平常操作的各種目錄是的含義是什麼~

java基礎知識學習--------枚舉類型1

blog 枚舉類型 csdn 相同 名稱 枚舉類 java string pac 枚舉類型的概念: 1 /** 2 * 目的:枚舉類型 3 * @author chenyanlong 4 * 日期:2017/10/22 5 * 網址:http://blo

Linux學習多執行緒程式設計

言之者無罪,聞之者足以戒。 ——《詩序》 (二)、執行緒的基本控制 1、終止程序: 如果程序中的任意一個程序呼叫了exit、_exit、_Exit,那麼整個程序就會終止 普通的單個程序有以下3種退出方式,這樣不會終止程序: (1)從啟動例程中返回,返回值是執行緒的退

Linux學習多執行緒程式設計

言之者無罪,聞之者足以戒。 ——《詩序》 三、Linux執行緒的高階控制 1、一次性初始化 有些事需要且只能執行一次(比如互斥量初始化)。通常當初始化應用程式時,可以比較容易地將其放在main函式中。但當你寫一個庫函式時,就不能在main裡面初始化了,你可以用靜態初始化

Linux學習多執行緒程式設計

言之者無罪,聞之者足以戒。 ——《詩序》 4、執行緒私有屬性 應用程式設計中有必要提供一種變數,使得多個函式多個執行緒都可以訪問這個變數(看起來是個全域性變數),但是執行緒對這個變數的訪問都不會彼此產生影響(貌似不是全域性變數哦),但是你需要這樣的資料,比如errno。那

Java基礎學習筆記十六 集合框架

first 哈希 cat etag 基於 col 容器 處的 新元素 List List接口的特點: 它是一個元素存取有序的集合。例如,存元素的順序是11、22、33。那麽集合中,元素的存儲就是按照11、22、33的順序完成的。 它是一個帶有索引的集合,通過索引就

機器學習SVM初解與淺析:最大距離

機器學習 svm 最大距離 2 / ||w|| 這段時間在看周誌華大佬的《機器學習》,在看書的過程中,有時候會搜搜其他人寫的文章,對比來講,周教授講的內容還是比較深刻的,但是前幾天看到SVM這一章的時候,感覺甚是晦澀啊,第一感覺就是比較抽象,特別是對於像本人這種I

機器學習SVM初解與淺析:

機器學習 svm 最大距離 2 / ||w||sdsshngshan‘gccha 這段時間在看周誌華大佬的《機器學習》,在看書的過程中,有時候會搜搜其他人寫的文章,對比來講,周教授講的內容還是比較深刻的,但是前幾天看到SVM這一章的時候,感覺甚是晦澀啊,第一感覺就

機器學習支持向量機:核函數和KKT條件的理解

麻煩 ron 現在 調整 所有 核函數 多項式 err ges 註:關於支持向量機系列文章是借鑒大神的神作,加以自己的理解寫成的;若對原作者有損請告知,我會及時處理。轉載請標明來源。 序: 我在支持向量機系列中主要講支持向量機的公式推導,第一部分講到推出拉格朗日對偶函數的對

機器學習支持向量機:支持向量機的公式推導

根據 監督式 art 通用 利用 哪些 這就是 在線 方法 註:關於支持向量機系列文章是借鑒大神的神作,加以自己的理解寫成的;若對原作者有損請告知,我會及時處理。轉載請標明來源。 序: 我在支持向量機系列中主要講支持向量機的公式推導,第一部分講到推出拉格朗日對偶函數的對偶因