This library encapsulates the details of building IB queue pairs and provides a user-friendly modern C++ interface, featuring coroutines.
Requires C++ 20 (i.e. gcc 10 or later).
Initialize the device, create a protection domain and create a completion queue with a corresponding poller, plus an event loop for QP exchanges with sockets:
#include <rdmapp/rdmapp.h>
int main(int argc, char *argv[]) {
auto device = std::make_shared<rdmapp::device>(0, 1);
auto pd = std::make_shared<rdmapp::pd>(device);
auto cq = std::make_shared<rdmapp::cq>(device);
auto cq_poller = std::make_shared<rdmapp::cq_poller>(cq);
auto loop = rdmapp::socket::event_loop::new_loop();
auto looper = std::thread([loop]() { loop->loop(); });
looper.detach();
}
On the server side, create an acceptor to accept QPs:
rdmapp::task<void> handle_qp(std::shared_ptr<rdmapp::qp> qp) {
char buffer[6] = "hello";
co_await qp->send(buffer, sizeof(buffer));
std::cout << "Sent to client: " << buffer << std::endl;
co_await qp->recv(buffer, sizeof(buffer));
std::cout << "Received from client: " << buffer << std::endl;
co_return;
}
rdmapp::task<void> server(rdmapp::acceptor &acceptor) {
while (true) {
auto qp = co_await acceptor.accept();
handle_qp(qp).detach();
}
co_return;
}
int main() {
// ...
rdmapp::acceptor acceptor(pd, cq, loop, 2333);
auto coro = server(acceptor);
coro.get_future().get();
}
On the client side, connect to server:
rdmapp::task<void> client(rdmapp::connector &connector) {
auto qp = co_await connector.connect();
char buffer[6];
co_await qp->recv(buffer, sizeof(buffer));
std::cout << "Received from server: " << buffer << std::endl;
std::copy_n("world", sizeof(buffer), buffer);
co_await qp->send(buffer, sizeof(buffer));
std::cout << "Sent to server: " << buffer << std::endl;
co_return;
}
int main(int argc, char *argv[]) {
// ...
rdmapp::connector connector(loop, "127.0.0.1", 2333, pd, cq);
auto coro = client(connector);
coro.get_future().get();
}
Browse examples
to learn more about this library.
Requires: C++ compiler with C++20 standard support and libibverbs
development headers installed.
git clone https://github.com/howardlau1999/rdmapp && cd rdmapp
cmake -Bbuild -DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_INSTALL_PREFIX=$INSTALL_DIR .
cmake --build build
# To install
cmake --install build
Install clang-format
and pre-commit
.
pip install pre-commit
pre-commit install