#[cfg(not(unix))]
fn main() {
eprintln!("❌ IPC transport is only available on Unix-like systems");
eprintln!(" This example requires Linux, macOS, or BSD");
std::process::exit(1);
}
#[cfg(unix)]
fn main() -> std::io::Result<()> {
monocoque::rt::LocalRuntime::new()?.block_on(async_main())
}
#[cfg(unix)]
async fn async_main() -> std::io::Result<()> {
use compio_buf::BufResult;
use compio_io::{AsyncRead, AsyncWriteExt};
use monocoque::rt;
use monocoque::zmq::ipc;
use std::time::Duration;
let socket_path = "/tmp/monocoque_ipc_example.sock";
println!("IPC Transport Example");
println!("=====================\n");
println!("Socket path: {socket_path}");
let _ = std::fs::remove_file(socket_path);
println!("\n1. Creating IPC listener...");
let listener = ipc::bind(socket_path).await?;
println!(" ✓ Listening on {socket_path}");
let server_task = rt::spawn(async move {
println!(" [Server] Waiting for connection...");
match ipc::accept(&listener).await {
Ok(mut stream) => {
println!(" [Server] ✓ Client connected");
let buffer = vec![0u8; 1024];
match stream.read(buffer).await {
BufResult(Ok(n), buffer) if n > 0 => {
let message = String::from_utf8_lossy(&buffer[..n]);
println!(" [Server] 📩 Received: {message}");
let response = "Hello from server!";
match stream.write_all(response.as_bytes()).await {
BufResult(Ok(()), _) => {
println!(" [Server] 📤 Sent response");
}
BufResult(Err(e), _) => {
eprintln!(" [Server] ❌ Write error: {e}");
}
}
}
BufResult(Ok(_), _) => {
println!(" [Server] ⚠ Empty message received");
}
BufResult(Err(e), _) => {
eprintln!(" [Server] ❌ Read error: {e}");
}
}
}
Err(e) => {
eprintln!(" [Server] ❌ Accept error: {e}");
}
}
});
rt::sleep(Duration::from_millis(50)).await;
println!("\n2. Connecting IPC client...");
let mut client = ipc::connect(socket_path).await?;
println!(" ✓ Connected to {socket_path}");
println!("\n3. Sending message from client...");
let message = "Hello from client!";
let BufResult(result, _) = client.write_all(message.as_bytes()).await;
result?;
println!(" ✓ Message sent");
println!("\n4. Waiting for server response...");
let buffer = vec![0u8; 1024];
let BufResult(result, buffer) = client.read(buffer).await;
let n = result?;
let response = String::from_utf8_lossy(&buffer[..n]);
println!(" 📩 Received: {response}");
rt::join(server_task).await;
let _ = std::fs::remove_file(socket_path);
println!("\n✅ IPC transport example completed successfully");
println!("\nPerformance characteristics:");
println!(" • Zero network overhead (in-kernel communication)");
println!(" • Lower latency than TCP loopback");
println!(" • No port allocation required");
println!(" • Automatic cleanup on process exit");
Ok(())
}