Linux Xmlrpc 安装及应用
1.xmlrpc安装sudo apt-get install libxmlrpc-c++8-dev2.测试程序服务端://xmlrpcserver.h#ifndef XMLRPCSERVER_H#define XMLRPCSERVER_H#include "xmlrpc-c/base.hpp"#include "xmlrpc-c/registry.hpp"#
·
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++
测试结果:
服务端:
客户端:
更多推荐
已为社区贡献1条内容
所有评论(0)