xref: /webrtc/mdns/examples/mdns_server.rs (revision ffe74184)
1 use webrtc_mdns as mdns;
2 
3 use mdns::Error;
4 use mdns::{config::*, conn::*};
5 
6 use clap::{App, AppSettings, Arg};
7 use std::io::Write;
8 use std::net::SocketAddr;
9 use std::str::FromStr;
10 
11 // For interop with webrtc-rs/mdns_server
12 // cargo run --color=always --package webrtc-mdns --example mdns_server
13 
14 // For interop with pion/mdns_client:
15 // cargo run --color=always --package webrtc-mdns --example mdns_server -- --local-name pion-test.local
16 
17 #[tokio::main]
main() -> Result<(), Error>18 async fn main() -> Result<(), Error> {
19     env_logger::Builder::new()
20         .format(|buf, record| {
21             writeln!(
22                 buf,
23                 "{}:{} [{}] {} - {}",
24                 record.file().unwrap_or("unknown"),
25                 record.line().unwrap_or(0),
26                 record.level(),
27                 chrono::Local::now().format("%H:%M:%S.%6f"),
28                 record.args()
29             )
30         })
31         .filter(None, log::LevelFilter::Trace)
32         .init();
33 
34     let mut app = App::new("mDNS Sever")
35         .version("0.1.0")
36         .author("Rain Liu <[email protected]>")
37         .about("An example of mDNS Sever")
38         .setting(AppSettings::DeriveDisplayOrder)
39         .setting(AppSettings::SubcommandsNegateReqs)
40         .arg(
41             Arg::with_name("FULLHELP")
42                 .help("Prints more detailed help information")
43                 .long("fullhelp"),
44         )
45         .arg(
46             Arg::with_name("server")
47                 .required_unless("FULLHELP")
48                 .takes_value(true)
49                 .default_value("0.0.0.0:5353")
50                 .long("server")
51                 .help("mDNS Server name."),
52         )
53         .arg(
54             Arg::with_name("local-name")
55                 .long("local-name")
56                 .takes_value(true)
57                 .default_value("webrtc-rs-test.local")
58                 .help("Local name"),
59         );
60 
61     let matches = app.clone().get_matches();
62 
63     if matches.is_present("FULLHELP") {
64         app.print_long_help().unwrap();
65         std::process::exit(0);
66     }
67 
68     let server = matches.value_of("server").unwrap();
69     let local_name = matches.value_of("local-name").unwrap();
70 
71     let server = DnsConn::server(
72         SocketAddr::from_str(server)?,
73         Config {
74             local_names: vec![local_name.to_owned()],
75             ..Default::default()
76         },
77     )
78     .unwrap();
79 
80     println!("Press ctlr-c to stop server");
81     tokio::signal::ctrl_c().await.unwrap();
82     server.close().await.unwrap();
83     Ok(())
84 }
85