Linux Xmlrpc 安装及应用

1.xmlrpc安装

sudo apt-get install libxmlrpc-c++8-dev

2.测试程序

服务端:

//xmlrpcserver.h


#ifndef XMLRPCSERVER_H
#define XMLRPCSERVER_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 // XMLRPCSERVER_H
//xmlrpcserver.cpp


#include "xmlrpcserver.h"

#include "xmlrpc-c/base.hpp"
#include "xmlrpc-c/registry.hpp"
#include "xmlrpc-c/server_abyss.h"

#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_add;

    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;
        return -1;
    }

    rm_add.sin_family = AF_INET;
    rm_add.sin_port = htons(port);
    rm_add.sin_addr.s_addr = INADDR_ANY;

    rc = bind(socket_fd, (struct sockaddr*)&rm_add, sizeof(struct sockaddr));
    if(-1 == rc)
    {
        cout<<"Can not bind to port "<<port<<endl;
        close(socket_fd);
        return -1;
    }

    return 0;
}
//main.cpp


#include <iostream>
#include "xmlrpcserver.h"

using namespace std;

int main(int argc, char *argv[])
{
    cout << "Hello World!" << endl;

    XmlRpcServer myServer(2655);

    if(myServer.setupSocket() != 0){
        return -1;
    }

    myServer.regester_xml_method();

    if(myServer.setupServer() != 0){
        cout<<"cannot set RPC Server"<<endl;
        return -1;
    }

    return 0;
}

服务端编译方法:

g++ -Wall -g xmlrpcserver.cpp main.cpp -o server.deamon -lstdc++ -lxmlrpc++ -lxmlrpc_server_abyss++ -lxmlrpc_server++

客户端程序:

//main.cpp


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

using namespace std;

int main(int argc, char *argv[])
{
    cout << "Hello World!" << endl;

    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;
}

客户端编译方法:

g++ -g -Wall main.cpp -o add_int -lstdc++ -lxmlrpc++ -lxmlrpc_client++

测试结果:

服务端:

客户端:

猜你喜欢

转载自blog.csdn.net/yuchunhai321/article/details/87276955