xmlrpc的c++代码在下载后的ros_comm-noetic-develutilitiesxmlrpcpp路径下。
还好,整个工程不算太大。xmlrpc分成客户端和服务器端两大部分。
咱们先看客户端,主要代码在xmlrpcclient.cpp文件里。
擒贼先擒王,xmlrpcclient.cpp文件中最核心的函数就是execute,用于执行远程调用,代码如下。
// execute the named procedure on the remote server.// params should be an array of the arguments for the method.// returns true if the request was sent and a result received (although the result might be a fault).bool xmlrpcclient::execute(const char* method, xmlrpcvalue const& params, xmlrpcvalue& result){ xmlrpcutil::log(1, xmlrpcclient::execute: method %s (_connectionstate %s)., method, connectionstatestr(_connectionstate)); // this is not a thread-safe operation, if you want to do multithreading, use separate // clients for each thread. if you want to protect yourself from multiple threads // accessing the same client, replace this code with a real mutex. if (_executing) return false; _executing = true; clearflagonexit cf(_executing); _sendattempts = 0; _isfault = false; if ( ! setupconnection()) return false; if ( ! generaterequest(method, params)) return false; result.clear(); double mstime = -1.0; // process until exit is called _disp.work(mstime); if (_connectionstate != idle || ! parseresponse(result)) { _header = ; return false; } // close() if server does not supports http1.1 // otherwise, reusing the socket to write leads to a sigpipe because // the remote server could shut down the corresponding socket. if (_header.find(http/1.1 200 ok, 0, 15) != 0) { close(); } xmlrpcutil::log(1, xmlrpcclient::execute: method %s completed., method); _header = ; _response = ; return true;}它首先调用setupconnection()函数与服务器端建立连接。
连接成功后,调用generaterequest()函数生成发送请求报文。
xmlrpc请求报文的头部又交给generateheader()函数做了,代码如下。
// prepend http headersstd::string xmlrpcclient::generateheader(size_t length) const{ std::string header = post + _uri + http/1.1rn user-agent: ; header += xmlrpc_version; header += rnhost: ; header += _host; char buff[40]; std::snprintf(buff,40,:%drn, _port); header += buff; header += content-type: text/xmlrncontent-length: ; std::snprintf(buff,40,%zurnrn, length); return header + buff;}主体部分则先将远程调用的方法和参数变成xml格式,generaterequest()函数再将头部和主体组合成完整的报文,如下:
std::string header = generateheader(body.length());_request = header + body;把报文发给服务器后,就开始静静地等待。
一旦接收到服务器返回的报文后,就调用parseresponse函数解析报文数据,也就是把xml格式变成纯净的数据格式。
我们发现,xmlrpc使用了socket功能实现客户端和服务器通信。
我们搜索socket这个单词,发现它原始的意思是插座。这非常形象,建立连接实现通信就像把插头插入插座。
虽说xmlrpc也是ros的一部分,但它毕竟只是一个基础功能,我们会用即可,暂时不去探究其实现细节,
CFTC将举行会议,探讨加密货币相关事宜
总投资达10亿美元的杭州中芯晶圆大尺寸硅片项目主体结构封顶正式完成
肺炎疫情是如何催生智能安防市场的新机遇
哪一种技术对未来的影响更大
2017年千元机首选,顶级性能与性价比都有了,准备入手了吗?
ROS是如何实现XMLRPC的
手机加上AI技术会有什么变化
紫光国微存储芯片业务逆势增长 将致力于成为“安全芯片领导者”
无人驾驶竞争现在什么情况
信息裸奔时代我们的隐私还安全吗
奔驰EQC座舱与T-Box拆解分析
国内MCU厂商如何应对涨价危机?
NPN和PNP两种型号三极管的使用和连接方法
专业传感器厂商霍尼韦尔调整战略
门延迟类型介绍
深圳市特发信息发布2018年第三季度报告,实现营业收入40.26亿元,同比增长7.25%
中兴通讯与英特尔联合发布了Light Cloud方案
答不上这三点,都不好意思说是干智能网联的
区块链将为汽车行业带来更多利益开辟新的篇章
ROG冰刃3sPlus上手 高颜值外观旗舰级配置