xref: /webrtc/mdns/examples/mdns_query.rs (revision 5d8fe953)
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