下面是转载的一篇文章,在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进行调用,远程调用函数式服务,具体运行结果可以参考https://blog.csdn.net/zckui/article/details/121147756 博客
linux 下 c++ 写的xmlrpc ,示例很全面.
这里提供了一个开源的xmlrpc的包,可以实现php和c++的通信,提供多线程编程接口,省去了自己写socket的麻烦。 代码中包含一个实例:client端是php的,server端的c++的。
XML-RPC客户端测试程序 向XMLRPC服务器发送一个XML-RPC请求,以文本文件读取xml文件; 记录返回的数据到文件中; windows命令行程序,使用前请配置*.pln文件 askcyg@hotmail.com
xmlrpc demo。包含服务端和客户端。入门的好例子。
基于XML rpc的实现源代码;可以使用soap实现类似的功能,但这个更容易使用
Odoo API客户端 该库允许通过Odoo XMLRPC API进行通信。 可以在这里找到有关它的文档: : 该库将允许您: 根据Odoo数据库中可用的信息生成PHP模型类,以简化对API的调用 通过XMLRPC API将请求发送到您的Odoo实例 ...
基于Chris Morley出色的著作“ XmlRpc ++”派生的XmlRpc库。 / *由ise GmbH 2013更改* /-添加了多线程支持-添加了对Windows编译的支持-扩展类XmlRpcValue用于某些定义的输入格式的自动类型识别-添加了二进制协议以...
一个C ++ XmlRpc库,仅在此阶段为Windows客户端。 它基于WinInet构建,而不是重新实现HTTP和HTTPS协议,因此具有对SSL的自动支持。
xmlrpc-c-1.51.05.tgz,xmlrpc的c和c++官方发布版本,xmlrpc用于嵌入式API调试,配合python客户端,非常方便。
最近的Android项目开发过程中一个问题困扰自己很长时间,Android客户端与服务器交互有几种方式,最常见的就是webservices和json。要在Android手机客户端与pc服务器交互,需要满足下面几种条件:跨平台、传输数据格式...
Delphi7使用XmlRpc实现C/S模式的短信发送,修正了XmlRpc2.0的一些错误, 服务端与客户端采用ADO.XML格式传送数据集(TADODataSet),数据库使用SQLit3.
xmlrpc-c-1.06.33.gz支持xmlrpc通讯,由c++实现
xmlrpc-2.0-src.zip java程序,主要用语开发rpc
linux下客户端xmlrpc上传文件的client源代码支持上传功能
利用XML-RPC ,C#作为客户端,C++作为服务器端,实现C++和C#交互
Java通过xmlrpc实现远程方法调用,如需xmlrpc可在网上下载。
基于 RPC 方式的文件传输应用开发: 实现一个简单的RPC分布应用,实现一个基于RPC 方式的文件传输应用。 功能: 1. 能够查询服务器端文件列表及文件信息; 2. 能够传输大文件,并且分片的方式进行传输。
xmlrpc jar包. 版本: 3.1.3
xmlrpc库