`
fanrey
  • 浏览: 254057 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Linux下 XmlRpc C++服务端客户端实现(cc)

 
阅读更多
下面是转载的一篇文章,在ubuntu下试验成功。转自:http://bbs.php100.com/apps.php?q=diary&uid=56398&a=detail&did=1265

服务端实现步骤:
    1. 创建socket套接字,并在某个端口打开;
    2. 定义并注册服务端方法;
    3. 运行服务端。
客户端实现步骤:
    1. 调用服务端注册的方法;
    2. 处理返回信息。
如下为一个XmlRpc的代码实现:

#######
server.h
#######
#ifndef SERVER_H_
#define SERVER_H_

#include <xmlrpc-c/base.hpp>
#include <xmlrpc-c/registry.hpp>
#include <xmlrpc-c/server_abyss.hpp>


class XmlrpcServer
{
private:
        class MyTestMethod: public xmlrpc_c::method
        {
        public:
                MyTestMethod()
                {
                  this->_signature = "A:ii";
                      this->_help = "This method adds two integers together";
                       }
  
                void execute(xmlrpc_c::paramList const& paramList,xmlrpc_c::value * const retval)
                {
                      const int addend(paramList.getInt(0));
                      const int adder(paramList.getInt(1));
  
                   *retval = (xmlrpc_c::value_int)(addend+adder);
                      }
        };
private:      
        xmlrpc_c::registry             addIntRegistry;
        xmlrpc_c::serverAbyss*      AbyssServer;
        int                                 port;
        int                                 socket_fd;
      
public:
        void    regester_xml_method();
        int    setupServer();
        int    setupSocket();
public:
        XmlrpcServer(int _port):port(_port),socket_fd(-1){};
};

#endif

#######
server.cpp
#######
#include "server.h"

#include <xmlrpc-c/base.hpp>
#include <xmlrpc-c/registry.hpp>
#include <xmlrpc-c/server_abyss.hpp>

#include <sys/signal.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/tcp.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <cstring>
#include <iostream>

using namespace std;

void XmlrpcServer::regester_xml_method()
{
    xmlrpc_c::methodPtr add_int(new XmlrpcServer::MyTestMethod);
    addIntRegistry.addMethod("add.int",add_int);
}

int XmlrpcServer::setupServer()
{
    AbyssServer = new xmlrpc_c::serverAbyss(xmlrpc_c::serverAbyss::constrOpt()
        .registryP(&addIntRegistry).socketFd(socket_fd));
   cout<< "Xmlrpc server is running......"<< endl;
    AbyssServer->run();
    cout<< "Xmlrpc server stopped"<< endl;
    return 0;
}

int XmlrpcServer::setupSocket()
{
    int                 rc;
   int                 yes = 1;
   struct sockaddr_in  rm_addr;
  
   socket_fd = socket(AF_INET, SOCK_STREAM, 0);
  
   if (-1 == socket_fd)
        {
       cout<< "Can not open server socket: " << endl;
      return -1;
        }

   rc = setsockopt(socket_fd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int));

    if (-1 == rc)
        {
        cout << "Can not set socket options: " <<endl;
      close(socket_fd);
      return -1;      
        }
    rm_addr.sin_family      = AF_INET;
    rm_addr.sin_port        = htons(port);
    rm_addr.sin_addr.s_addr = INADDR_ANY;

    rc = bind(socket_fd,(struct sockaddr *) &(rm_addr),sizeof(struct sockaddr));

    if (-1 == rc)
        {
        cout << "Can not bind to port " << port <<endl;
      close(socket_fd);
      return -1;
        }
    return 0;
}

##########
serverMain.cpp
##########
#include "server.h"
#include <iostream>

using namespace std;

int main(void)
{
    XmlrpcServer myServer(2655);
    if(myServer.setupSocket() != 0)
    return -1;
    myServer.regester_xml_method();
    if(myServer.setupServer() != 0)
    {
        cout<< "cannot setup RPC Server"<< endl;
        return -1;
    }
    return 0;
}


########
clientMain.cpp
########
#include <xmlrpc-c/base.hpp>
#include <xmlrpc-c/client_simple.hpp>
#include <iostream>
#include <stdlib.h>

using namespace std;

int main(int argc,char **argv)
{
    int a,b,int_result;
    xmlrpc_c::value result;
    if(argc != 3)
    {
        cout<< "please input Two interger numbers: "<< endl;
        cin >>a >>b;
    }
    else
    {
        a = atoi((argv[1]));
        b = atoi((argv[2]));
    }
  
    xmlrpc_c::clientSimple myClient;
    myClient.call("http://localhost:2655/RPC2","add.int","ii",&result,a,b);
    int_result = (xmlrpc_c::value_int)(result);
    cout<< "sum of " <<a<<" and "<< b<< " is " << int_result<< endl;
    return 0;
}

用gcc编译器编译,编译命令为:
服务端:
gcc -Wall -g server.cpp serverMain.cpp -o server.deamon -lstdc++ -lxmlrpc++ -lxmlrpc_server_abyss++ -lxmlrpc_server

客户端:
gcc -g -Wall -o add_int clientMain.cpp -lstdc++ -lxmlrpc_client++

测试:
可执行文件生成成功后,运行 " ./server.deamon "
然后执行 " ./add_int 1 2 " 得输出结果:sum of 1 and 2 is 3
执行 ./add_int 1456 456465 3
please input Two interger numbers:
4 9
sum of 4 and 9 is 13
运行成功!
分享到:
评论

相关推荐

    xmlrpc远程函数式服务调用,C++作为服务端,python、C++客户端通过http进行调用

    xmlrpc远程函数式服务调用,C++作为服务端,python、C++客户端通过http进行调用,远程调用函数式服务,具体运行结果可以参考https://blog.csdn.net/zckui/article/details/121147756 博客

    linux 下 c++ 写的xmlrpc

    linux 下 c++ 写的xmlrpc ,示例很全面.

    xmlrpc实现php和后台c++的通信

    在这个场景中,我们关注的是如何利用XMLRPC实现在PHP和C++之间的通信。XMLRPC通过将方法调用和参数编码为XML消息,然后通过HTTP传递,服务器解码后执行相应操作并返回结果。 首先,我们需要了解XMLRPC的基本结构。...

    xmlrpc基于xml rpc实现源代码

    相对于SOAP,XMLRPC更轻量级,不需要复杂的WSDL文档,因此在某些场景下,XMLRPC可能更易于实现和部署。 从提供的压缩包文件名“xmlrpc-c-1.06.32”来看,这可能是XMLRPC-C的一个版本,一个用C语言编写的XMLRPC库。...

    Go-go-xmlrpc-为golang添加XMLRPC支持

    总的来说,`go-xmlrpc`库是Golang开发者在处理XMLRPC通信时的一个强大工具,它简化了XMLRPC服务端和客户端的实现,提高了开发效率,同时也保证了代码的可读性和维护性。通过深入理解和使用这个库,你可以轻松地在...

    XMLRPC调用webservice

    `Zend`是一个PHP开发框架,其中包含了一个强大的XMLRPC扩展,可以方便地实现XMLRPC服务端和客户端的功能。在`Zend Framework`中,我们可以使用`Zend_XmlRpc_Server`创建服务端,定义处理函数;使用`Zend_XmlRpc_...

    xmlrpc demo

    这个"xmlrpc demo"是一个示例项目,包含服务端和客户端的实现,是学习XMLRPC入门的良好起点。 在服务端,XMLRPC服务器通常会监听一个特定的HTTP端口,等待来自客户端的请求。当请求到来时,服务器解析XML数据,识别...

    xmlrpc-2.0-src.zip_xmlrpc_xmlrpc java_xmlrpc s_xmlrpc-2.0.1.jar_

    标签"xmlrpc xmlrpc_java xmlrpc_s xmlrpc-2.0.1.jar zip"进一步强调了这个资源与Java语言的XMLRPC库、XMLRPC服务(xmlrpc_s可能指代服务端组件)以及对应的jar文件相关,同时指出文件是以zip格式打包的。...

    xmlrpc-c-0.9.9.tar.gz_xml_xml c++_xml rpc c++ windo_xmlrpc

    例如,它可以用于控制远程设备、实现客户端和服务端之间的数据同步,或者构建可扩展的网络应用程序。 7. **安全考虑**:虽然XMLRPC提供了一种简单的方式来调用远程服务,但它的安全性依赖于传输层的安全措施,如...

    xmlrpc类库

    例如,一个基于Web的应用可能需要与后台数据库服务器进行通信,这时就可以使用XMLRPC来实现客户端和服务器之间的数据交换。开发者可以通过XMLRPC库轻松地在各种编程语言中实现远程调用,如Python、PHP、Java、C++等...

    XMLRPC jar包+教程+例子

    在Java环境中,XMLRPC库是一个常用的选择,可以方便地实现客户端和服务端的通信。 本教程主要围绕以下几个知识点展开: 1. **XMLRPC的基本概念**: - XMLRPC的核心思想是通过XML来封装参数和返回值,然后通过HTTP...

    基于python的xmlrpc示例

    在Python中,XMLRPC提供了一种轻量级的跨平台解决方案,用于实现服务器和客户端之间的交互。 在给定的文件列表中,我们可以看到以下三个关键文件: 1. server.py:这是一个XMLRPC服务器的实现。Python的`xmlrpc....

    XML-RPC客户端程序

    XML-RPC客户端测试程序 向XMLRPC服务器发送一个XML-RPC请求,以文本文件读取xml文件; 记录返回的数据到文件中; windows命令行程序,使用前请配置*.pln文件 askcyg@hotmail.com

    Ub.XMLRPC.rar_xmlrpc

    在"Ub.XMLRPC"这个项目中,开发者可能已经实现了服务器端的XMLRPC服务,以及客户端如何调用这些服务的示例代码。这些代码可以帮助我们理解XMLRPC的工作原理,以及如何在C#中进行实现。通过分析和学习这些代码,我们...

    xmlrpc简单示例

    XMLRPC的核心思想是使用HTTP作为传输协议,XML作为数据交换格式,实现客户端和服务器之间的通信。这种设计使得XMLRPC具有跨平台、跨语言的特性,可以在各种操作系统和编程语言中无缝集成。 ### XMLRPC的工作流程 1...

    java xmlrpc框架包

    这个框架使得开发者可以轻松地在Java应用中实现客户端和服务器端的交互,而无需关心底层的网络细节。 XMLRPC的核心概念是通过XML来封装方法名和参数,然后将封装后的XML数据作为HTTP请求的主体发送给服务器。服务器...

    XML-RPC 实现C++和C#交互

    在这个场景中,我们使用XML-RPC来实现C++和C#之间的交互,其中C#作为客户端,C++作为服务器端。 ### XML-RPC 基本原理 XML-RPC的核心思想是通过HTTP协议传输XML编码的函数调用和返回值。XML文档包含了方法名、参数...

    Java xmlrpc远程方法调用(源码)

    这个库提供客户端和服务端API,使得开发人员能够轻松地实现远程方法调用。 - 你可以从官方网站或者其他可靠的源下载XML-RPC库,然后将其引入到你的项目中。 3. **服务端实现**: - 创建一个实现了XML-RPC服务器端...

    XMLRPC .net接口

    在.NET环境中,XMLRPC.NET接口提供了一种实现XMLRPC客户端和服务端的方法,使得开发者能够轻松地创建能够与其他系统进行交互的应用程序。 XMLRPC.NET接口的核心概念包括以下几点: 1. **请求与响应**:XMLRPC通信...

Global site tag (gtag.js) - Google Analytics