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 use tokio::sync::mpsc;
11
12 // For interop with webrtc-rs/mdns_server
13 // cargo run --color=always --package webrtc-mdns --example mdns_query
14
15 // For interop with pion/mdns_server:
16 // cargo run --color=always --package webrtc-mdns --example mdns_query -- --local-name pion-test.local
17
18 #[tokio::main]
main() -> Result<(), Error>19 async fn main() -> Result<(), Error> {
20 env_logger::Builder::new()
21 .format(|buf, record| {
22 writeln!(
23 buf,
24 "{}:{} [{}] {} - {}",
25 record.file().unwrap_or("unknown"),
26 record.line().unwrap_or(0),
27 record.level(),
28 chrono::Local::now().format("%H:%M:%S.%6f"),
29 record.args()
30 )
31 })
32 .filter(None, log::LevelFilter::Trace)
33 .init();
34
35 let mut app = App::new("mDNS Query")
36 .version("0.1.0")
37 .author("Rain Liu <[email protected]>")
38 .about("An example of mDNS Query")
39 .setting(AppSettings::DeriveDisplayOrder)
40 .setting(AppSettings::SubcommandsNegateReqs)
41 .arg(
42 Arg::with_name("FULLHELP")
43 .help("Prints more detailed help information")
44 .long("fullhelp"),
45 )
46 .arg(
47 Arg::with_name("server")
48 .required_unless("FULLHELP")
49 .takes_value(true)
50 .default_value("0.0.0.0:5353")
51 .long("server")
52 .help("mDNS Server name."),
53 )
54 .arg(
55 Arg::with_name("local-name")
56 .long("local-name")
57 .takes_value(true)
58 .default_value("webrtc-rs-test.local")
59 .help("Local name"),
60 );
61
62 let matches = app.clone().get_matches();
63
64 if matches.is_present("FULLHELP") {
65 app.print_long_help().unwrap();
66 std::process::exit(0);
67 }
68
69 let server = matches.value_of("server").unwrap();
70 let local_name = matches.value_of("local-name").unwrap();
71
72 let server = DnsConn::server(
73 SocketAddr::from_str(server)?,
74 Config {
75 ..Default::default()
76 },
77 )
78 .unwrap();
79
80 log::info!("querying dns");
81
82 let (_a, b) = mpsc::channel(1);
83
84 let (answer, src) = server.query(local_name, b).await.unwrap();
85 log::info!("dns queried");
86 println!("answer = {answer}, src = {src}");
87
88 server.close().await.unwrap();
89 Ok(())
90 }
91