arzmq 0.6.2

High-level bindings to the zeromq library
Documentation
use core::sync::atomic::Ordering;
use std::thread;

use arzmq::prelude::{
    ClientSocket, Context, Message, Receiver, RecvFlags, SendFlags, Sender, ServerSocket, ZmqResult,
};

mod common;

use common::KEEP_RUNNING;

fn run_server_socket(server: &ServerSocket, reply: &str) -> ZmqResult<()> {
    let message = server.recv_msg(RecvFlags::empty())?;
    println!("Received message: \"{message:?}\"");

    let returned: Message = reply.into();
    returned.set_routing_id(message.routing_id().unwrap())?;
    server.send_msg(returned, SendFlags::empty())
}

fn main() -> ZmqResult<()> {
    let iterations = 10;

    let context = Context::new()?;

    let server = ServerSocket::from_context(&context)?;
    server.bind("tcp://127.0.0.1:*")?;
    let client_endpoint = server.last_endpoint()?;

    thread::spawn(move || {
        while KEEP_RUNNING.load(Ordering::Acquire) {
            run_server_socket(&server, "World").unwrap();
        }
    });

    let client = ClientSocket::from_context(&context)?;
    client.connect(client_endpoint)?;

    (0..iterations).try_for_each(|_| common::run_send_recv(&client, "Hello"))?;

    KEEP_RUNNING.store(false, Ordering::Release);

    Ok(())
}