XTP: 从XTP看Rust与C++接口FFI通信
XTP.rs 来源于:
https://github.com/dovahcrow/xtp-rs
一、从RUST ->C++:
当Rust需要把指令传入XTP中时,以register_spi为例
1、rust中.rs文件中
let mut api = QuoteApi::new(1, &args.path, XTPLogLevel::Trace);info!("XTP Version: {:?}", api.get_api_version());
info!("Trading Day: {:?}", api.get_trading_day());api.register_spi(MySpi);
2、quote_api.rs
pub fn register_spi<T: QuoteSpi>(&mut self, spi: T) {let trait_object_box: Box<Box<dyn QuoteSpi>> = Box::new(Box::new(spi));let trait_object_pointer =Box::into_raw(trait_object_box) as *mut Box<dyn QuoteSpi> as *mut c_void;let quote_spi_stub = unsafe { QuoteSpiStub::new(trait_object_pointer) };let ptr = Box::into_raw(Box::new(quote_spi_stub));self.quote_spi_stub = Some(ptr);unsafe { QuoteApi_RegisterSpi(self.quote_api, ptr as *mut XTP_API_QuoteSpi) };
}
3、到 bind.rs =>
extern "C" {pub fn QuoteApi_RegisterSpi(self_: *mut XTP_API_QuoteApi, spi: *mut XTP_API_QuoteSpi);
}
4、bridge.cpp
extern "C" void QuoteApi_RegisterSpi(XTP::API::QuoteApi *self, XTP::API::QuoteSpi *spi)
{auto s = static_cast<XTP::API::QuoteApi *>(self);return s->RegisterSpi(spi);
}
二、从C++ > RUST:
当 XTP有响应时,
以OnDepthMarketData为例:
1、从头文件xtp_quote_api.h中QuoteSpi类
2、到 bridge.cpp中
实例QuoteSpiStub-> QuoteSpiStub::OnDepthMarketData ->
void QuoteSpiStub::OnDepthMarketData(XTPMD *market_data, int64_t bid1_qty[], int32_t bid1_count, int32_t max_bid1_count, int64_t ask1_qty[], int32_t ask1_count, int32_t max_ask1_count)
{return QuoteSpiStub_Rust_OnDepthMarketData(this->rust_object, market_data, bid1_qty, bid1_count, max_bid1_count, ask1_qty, ask1_count, max_ask1_count);
}
3、到 Quotespi.rs =>
#[no_mangle]
pub unsafe extern "C" fn QuoteSpiStub_Rust_OnDepthMarketData(spi: *mut c_void,market_data: *const XTPMD,bid1_qty: *const i64,bid1_count: i32,max_bid1_count: i32,ask1_qty: *const i64,ask1_count: i32,max_ask1_count: i32,
) {let spi = unwrap_quote_spi(spi);let market_data = RXTPMD::from_raw(&*market_data);let bid1_qty = from_raw_parts(bid1_qty, bid1_count as usize);let ask1_qty = from_raw_parts(ask1_qty, ask1_count as usize);spi.on_depth_market_data(market_data,bid1_qty,max_bid1_count,ask1_qty,max_ask1_count,);
}
=>trait QuoteSpi =>分发给实现trait的对象
XTP: 从XTP看Rust与C++接口FFI通信相关推荐
- 笔记本计算机接口类型,小白入门必看!笔记本电脑常见接口都在这了
原标题:小白入门必看!笔记本电脑常见接口都在这了 对很多没接触过或者刚接触笔记本电脑的朋友来说,笔记本电脑的接口是个比较令人头疼的问题,一是接口种类繁多,二是很多接口长得比较像,不易分辨,下面就给大家 ...
- 【VC++技术杂谈005】如何与程控仪器通过GPIB接口进行通信
在工控测试系统中,经常需要使用到各类程控仪器,这些程控仪器通常具有GPIB.LAN.USB等硬件接口,计算机通过这些接口能够与其通信,从而实现自动测量.数据采集.数据分析和数据处理等操作.本文主要介绍 ...
- RS232接口转USB接口的通信方法
2006-05-03 21:44:07 组图]RS232接口转USB接口的通信方法 RS232接口转USB接口的通信方法 USB作为一种新的PC机互连协议,使外设到计算机的连接更加高效.便利.这种接口 ...
- 如何与程控仪器通过GPIB接口进行通信
在工控测试系统中,经常需要使用到各类程控仪器,这些程控仪器通常具有GPIB.LAN.USB等硬件接口,计算机通过这些接口能够与其通信,从而实现自动测量.数据采集.数据分析和数据处理等操作.本文主要介绍 ...
- 股票交易接口除了通信达还有哪些
股票交易接口除了通信达还有哪些,还有东财量化接口.雪球量化接口.米筐量化接口.天勤量化接口等等这些.
- 吃灰树莓派第二篇|不设置主从机,看ROS2如何进行多机通信
小鱼吃灰树莓派第二篇|不设置主从机,看ROS2如何进行多机通信 吃灰小鱼 一.ROS2多机通信实践 1.1 让树莓派和电脑连接在同一个局域网 1.2 使用ros2的多播(multicast)指令测试 ...
- java对gpib接口控制_【VC++技术杂谈005】如何与程控仪器通过GPIB接口进行通信
在工控测试系统中,经常需要使用到各类程控仪器,这些程控仪器通常具有GPIB.LAN.USB等硬件接口,计算机通过这些接口能够与其通信,从而实现自动测量.数据采集.数据分析和数据处理等操作.本文主要介绍 ...
- 计算机接口与通信教学大纲,接口与通信教学大纲.doc
接口与通信教学大纲 <接口与通信>I课程教学大纲 Interface & Communications 课程编号:241018 适用专业:计算机科学与技术 学时数:64(其中, ...
- 半导体玻璃管标签工业级低频RFID读写器阅读器CK-S640-AP60E开发手册之硬件接口与通信
半导体玻璃管标签工业级低频RFID读写器阅读器CK-S640-AP60E开发手册之硬件接口与通信 半导体玻璃管标签工业级低频RFID读写器阅读器CK-S640-AP60E符合世界SEMI标准.是专门面 ...
- Rust linux 系统接口使用
前言 官方已经引入 Linux api 到 Rust 中, 但是需要在代码中注明为不安全代码进行使用,尤其是mmap的使用,可以先试用看看情况 官方api 手册地址 https://docs.rs/n ...
最新文章
- Contiki Process概述
- redisson MultiLock原理及分布式锁的应用
- 搭建 LEGO EV3 的 PyCharm Python 开发环境
- 【算法设计与分析】Dijskra算法代码:Java版
- Python基础之:Python中的异常和错误
- Linux中拷贝和移动文件
- Docker 入门(4)镜像与容器
- 工程师如何培养美学思维
- pyqt5 发送键盘信号_Python教程 | Pyqt5实战教程之操作交互处理,原来这么简单!...
- vue 方法获取返回值_Vue项目中Api的组织和返回数据处理的操作
- Java对数组的操作(二)—集合与数组的切换
- 公式推导 11-20
- 数控机床通信协议汇总
- 《打开量化投资的黑箱》
- 如何写一个脚本(附送一个脚本)
- 在开发版上用C语言写实心圆,MFC利用CPen与CBrush绘制实心圆
- 如何将wav文件切成多个子文件
- 尚硅谷的后台管理系统学习笔记【尚硅谷】【Vue】
- 华为苏箐被曝转投大众汽车:最狂智能车高管,因抨击特斯拉丢工作,任正非亲自签发罢免令...
- 【论文阅读|cryoET】Isotropic reconstruction for electrontomography with deep learning (解决缺失楔问题降噪)