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] 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 = {}, src = {}", answer, src); 87 88 server.close().await.unwrap(); 89 Ok(()) 90 } 91