1 #![cfg_attr(not(unix), allow(unused_imports))] 2 3 use std::path::Path; 4 #[cfg(unix)] 5 use tokio::net::UnixListener; 6 #[cfg(unix)] 7 use tokio_stream::wrappers::UnixListenerStream; 8 #[cfg(unix)] 9 use tonic::transport::server::UdsConnectInfo; 10 use tonic::{transport::Server, Request, Response, Status}; 11 12 pub mod hello_world { 13 tonic::include_proto!("helloworld"); 14 } 15 16 use hello_world::{ 17 greeter_server::{Greeter, GreeterServer}, 18 HelloReply, HelloRequest, 19 }; 20 21 #[derive(Default)] 22 pub struct MyGreeter {} 23 24 #[tonic::async_trait] 25 impl Greeter for MyGreeter { 26 async fn say_hello( 27 &self, 28 request: Request<HelloRequest>, 29 ) -> Result<Response<HelloReply>, Status> { 30 #[cfg(unix)] 31 { 32 let conn_info = request.extensions().get::<UdsConnectInfo>().unwrap(); 33 println!("Got a request {:?} with info {:?}", request, conn_info); 34 } 35 36 let reply = hello_world::HelloReply { 37 message: format!("Hello {}!", request.into_inner().name), 38 }; 39 Ok(Response::new(reply)) 40 } 41 } 42 43 #[cfg(unix)] 44 #[tokio::main] 45 async fn main() -> Result<(), Box<dyn std::error::Error>> { 46 let path = "/tmp/tonic/helloworld"; 47 48 std::fs::create_dir_all(Path::new(path).parent().unwrap())?; 49 50 let greeter = MyGreeter::default(); 51 52 let uds = UnixListener::bind(path)?; 53 let uds_stream = UnixListenerStream::new(uds); 54 55 Server::builder() 56 .add_service(GreeterServer::new(greeter)) 57 .serve_with_incoming(uds_stream) 58 .await?; 59 60 Ok(()) 61 } 62 63 #[cfg(not(unix))] 64 fn main() { 65 panic!("The `uds` example only works on unix systems!"); 66 } 67