首页 > 其他分享 >XmlRPC入门_基于C的服务端、客户端

XmlRPC入门_基于C的服务端、客户端

时间:2023-12-01 16:35:57浏览次数:29  
标签:const XmlRPC xmlrpc fault envP env include 服务端 客户端

以下客户端与服务端的代码内容为官网给出的示例,此处拷贝记录,了解基础使用方式。

1、服务端

#include <iostream>
#include <winsock2.h>
#include <windows.h>

#include "xmlrpc-c/base.h"
#include "xmlrpc-c/server.h"
#include "xmlrpc-c/server_abyss.h"
#include <direct.h>
#include <stdio.h>
#include <stdlib.h>
#include <direct.h>
static xmlrpc_value *sample_add(xmlrpc_env * const envP,
    xmlrpc_value * const paramArrayP,
    void *         const serverInfo,
    void *         const channelInfo) {

    xmlrpc_int32 x, y, z;

    /* Parse our argument array. */
    xmlrpc_decompose_value(envP, paramArrayP, "(ii)", &x, &y);
    if (envP->fault_occurred)
        return NULL;

    /* Add our two numbers. */
    z = x + y;

    /* Sometimes, make it look hard (so client can see what it's like
       to do an RPC that takes a while).
    */
    if (y == 1)
        Sleep(5);

    /* Return our result. */
    return xmlrpc_build_value(envP, "i", z);
}

int main() {
    struct xmlrpc_method_info3 const methodInfo = {
        /* .methodName     = */ "sample.add",
        /* .methodFunction = */ &sample_add,
    };
    xmlrpc_server_abyss_parms serverparm;
    xmlrpc_registry * registryP;
    xmlrpc_env env;

    xmlrpc_env_init(&env);

    registryP = xmlrpc_registry_new(&env);
    if (env.fault_occurred) {
        printf("xmlrpc_registry_new() failed.  %s\n", env.fault_string);
        exit(1);
    }

    xmlrpc_registry_add_method3(&env, registryP, &methodInfo);
    if (env.fault_occurred) {
        printf("xmlrpc_registry_add_method3() failed.  %s\n",
            env.fault_string);
        exit(1);
    }

    serverparm.config_file_name = NULL;   /* Select the modern normal API */
    serverparm.registryP = registryP;
    serverparm.port_number = 8080;
    serverparm.log_file_name = "/tmp/xmlrpc_log";

    printf("Running XML-RPC server...\n");

    xmlrpc_server_abyss(&env, &serverparm, XMLRPC_APSIZE(log_file_name));
    if (env.fault_occurred) {
        printf("xmlrpc_server_abyss() failed.  %s\n", env.fault_string);
        exit(1);
    }
    /* xmlrpc_server_abyss() never returns unless it fails */

    return 0;
}

 2、客户端

#include <iostream>
#include "xmlrpc-c/base.h"
#include "xmlrpc-c/client.h"
#include "xmlrpc-c/client_global.h"
#include "xmlrpc-c/util.h"
#include <stdio.h>
#include <stdlib.h>

#include <vector>
#include <string>
#include <thread>
#include <algorithm>
#include <afx.h>
#include <winsock2.h>
#define NAME "Xmlrpc-c Test Client"
#define VERSION "1.0"

static void dieIfFaultOccurred(xmlrpc_env * const envP) {
    if (envP->fault_occurred) {
        fprintf(stderr, "ERROR: %s (%d)\n",
            envP->fault_string, envP->fault_code);
        exit(1);
    }
}

int main(int const argc, const char ** const argv) {

    xmlrpc_env env;
    xmlrpc_value * resultP;
    xmlrpc_int32 sum;
    const char * const serverUrl = "http://localhost:8080/RPC2";
    const char * const methodName = "sample.add";

    if (argc - 1 > 0) {
        fprintf(stderr, "This program has no arguments\n");
        exit(1);
    }

    /* Initialize our error-handling environment. */
    xmlrpc_env_init(&env);

    /* Create the global XML-RPC client object. */
    xmlrpc_client_init2(&env, XMLRPC_CLIENT_NO_FLAGS, NAME, VERSION, NULL, 0);
    dieIfFaultOccurred(&env);

    printf("Making XMLRPC call to server url '%s' method '%s' "
        "to request the sum "
        "of 5 and 7...\n", serverUrl, methodName);

    /* Make the remote procedure call */
    resultP = xmlrpc_client_call(&env, serverUrl, methodName,
        "(ii)", (xmlrpc_int32)5, (xmlrpc_int32)7);
    dieIfFaultOccurred(&env);

    /* Get our sum and print it out. */
    xmlrpc_read_int(&env, resultP, &sum);
    dieIfFaultOccurred(&env);
    printf("The sum is %d\n", sum);

    /* Dispose of our result value. */
    xmlrpc_DECREF(resultP);

    /* Clean up our error-handling environment. */
    xmlrpc_env_clean(&env);

    /* Shutdown our XML-RPC client library. */
    xmlrpc_client_cleanup();

    return 0;
}

标签:const,XmlRPC,xmlrpc,fault,envP,env,include,服务端,客户端
From: https://www.cnblogs.com/missyou0813/p/17869968.html

相关文章

  • 个推文档 > 服务端 > C# > 快速入门
    转自:https://docs.getui.com/getui/server/csharp/start/.NETCore版本个推C#SDK支持.NetCore版本,可以到后面的网址去下载的.NetSDK(版本要求>=2.2):(https://dotnet.microsoft.com/download/)下载个推C#Demo, .NETCoredemo 目录结构如下图所示: ......
  • centos上安装redis、redis客户端操作、redis使用场景、通用命令
    centos上安装redis#win上装redis#上线--》centos装了--》详细研究#docker装---》配置--》持久化#官网看看-redis源码-----》自己编译-redisstack----》编译过后的可执行文件-6.x版本#咱们刚刚下了几个软件-redis-6.2.14-reids......
  • XmlRPC入门_组合类型操作
    1、数组操作#include<iostream>#include<winsock2.h>#include<windows.h>#include<xmlrpc-c/base.hpp>#include<xmlrpc-c/registry.hpp>#include<xmlrpc-c/server_abyss.hpp>#include<direct.h>#include<stdio.h&......
  • XmlRPC入门_基本类型操作
    #include<iostream>#include<winsock2.h>#include<windows.h>#include<xmlrpc-c/base.hpp>#include<xmlrpc-c/registry.hpp>#include<xmlrpc-c/server_abyss.hpp>#include<direct.h>#include<stdio.h>#inc......
  • 如何查看redis中当前的客户端连接并且杀掉某些客户端连接
    查看当前的redisclient信息 进入redis控制台,执行命令clientlist  释放(杀掉)某些客户端 执行命令clientkill<客户端地址> 客户端地址,就是上面的addr=的部分 示例:clientkill10.1.40.156:24830  执行正确,会返回OK,表示客户端连接已经被kill掉了......
  • XmlRPC入门_形参定义
    形参类型的定义略Thestringlookssomethinglikethisexample:i:iii,s:.Itisalistofsignaturestrings,separatedbycommas.Intheexample,therearetwosignatures:i:iiis:Eachsignaturestringdescribesoneformofcallingthemethod.Asignatures......
  • 客户端开发工作总结
    1.动机在长达8年的前端工作经验后,发现还是不知道想做啥。自己对技术的掌握还是停留在对数据的展示和存储上。因此先对之前的工作中用到的知识做一个抽象的总结,再思考自己应该去掌握什么技术,又想学什么技术。2.认知客户端开发主要工作即开发UI(userinterface),与用户交互的界面......
  • Nacos源码(三):SpringCloud-Nacos客户端注册源码分析
    1、服务注册源码入口在笔记(二):Nacos环境搭建中提到Nacos作为注册中心,在服务启动类中可通过添加可选配置注解@EnableDiscoveryClient,那么就先从这个注解入手,开启SpringCloud的Nacos注册中心的源码分析。EnableDiscoveryClient注解详情:EnableDiscoveryClientImport......
  • Chat2DB高颜值、免费开源、集成AI的数据库客户端
     Chat2DB是一款有开源免费的多数据库客户端工具,支持windows、mac本地安装,也支持服务器端部署,web网页访问。和传统的数据库客户端软件Navicat、DBeaver相比Chat2DB集成了AIGC的能力,能够将自然语言转换为SQL,也可以将SQL转换为自然语言,可以给出研发人员SQL的优化建......
  • 大数据实验(Mysql、hbase、redis、MongoDBjava客户端连接)
    1.MySQL启动:虚拟机输入mysql-uroot-p输入密码:hadoop(黑马的mysql密码是hadoop)pom.xml需要引入mysql<properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target></proper......