use async_rdma::{ConnectionType, LocalMrReadAccess, LocalMrWriteAccess, RdmaBuilder};
use std::{alloc::Layout, env, io::Write, process::exit};
const BUF_SIZE: usize = 16;
const BUF_FILLER: u8 = 1;
async fn run(node: &str, service: &str) {
let rdma = RdmaBuilder::default()
.set_conn_type(ConnectionType::RCCM)
.set_raw(true)
.cm_connect(node, service)
.await
.unwrap();
let mut lmr = rdma
.alloc_local_mr(Layout::new::<[u8; BUF_SIZE]>())
.unwrap();
let _ = lmr.as_mut_slice().write(&[BUF_FILLER; BUF_SIZE]).unwrap();
let _ = rdma.send_raw(&lmr).await.unwrap();
println!("send {:?}", *lmr.as_slice());
let recv_mr = rdma
.receive_raw(Layout::new::<[u8; BUF_SIZE]>())
.await
.unwrap();
assert_eq!(*recv_mr.as_slice(), [BUF_FILLER; BUF_SIZE]);
println!("recv: {:?}", *recv_mr.as_slice());
}
#[tokio::main]
async fn main() {
tracing_subscriber::fmt::init();
println!("cm_client: start");
let args: Vec<String> = env::args().collect();
if args.len() != 3 {
println!("usage : cargo run --example client <server_ip> <port>");
println!("input : {:?}", args);
exit(-1);
}
let ip = args.get(1).unwrap().as_str();
let port = args.get(2).unwrap().as_str();
run(ip, port).await;
println!("cm_client: end");
}