From f7a9ecafd3aa6a63ff838c7ce01f8451afd2b46d Mon Sep 17 00:00:00 2001 From: Jonathan Cobb Date: Sat, 19 Sep 2020 12:03:49 -0400 Subject: [PATCH] try tcp first for dns resolution on windows --- src/dns_cache.rs | 72 ++++++++++++++++++++++++++++++++++-------------- src/net.rs | 2 +- 2 files changed, 53 insertions(+), 21 deletions(-) diff --git a/src/dns_cache.rs b/src/dns_cache.rs index fcd09f5..8aaa31d 100644 --- a/src/dns_cache.rs +++ b/src/dns_cache.rs @@ -25,29 +25,61 @@ use tokio::task::JoinHandle; use trust_dns_resolver::TokioAsyncResolver; use trust_dns_resolver::config::{NameServerConfig, Protocol, ResolverConfig, ResolverOpts}; +use whoami::{platform, Platform}; + pub async fn create_resolver(dns1_sock: SocketAddr, dns2_sock: SocketAddr) -> TokioAsyncResolver { let mut resolver_config: ResolverConfig = ResolverConfig::new(); - resolver_config.add_name_server(NameServerConfig { - socket_addr: dns1_sock, - protocol: Protocol::Udp, - tls_dns_name: None - }); - resolver_config.add_name_server(NameServerConfig { - socket_addr: dns1_sock, - protocol: Protocol::Tcp, - tls_dns_name: None - }); - resolver_config.add_name_server(NameServerConfig { - socket_addr: dns2_sock, - protocol: Protocol::Udp, - tls_dns_name: None - }); - resolver_config.add_name_server(NameServerConfig { - socket_addr: dns2_sock, - protocol: Protocol::Tcp, - tls_dns_name: None - }); + let platform : Platform = platform(); + match platform { + Platform::Windows => { + // try TCP first on Windows, UDP sockets may have permission issues (?) + resolver_config.add_name_server(NameServerConfig { + socket_addr: dns1_sock, + protocol: Protocol::Tcp, + tls_dns_name: None + }); + resolver_config.add_name_server(NameServerConfig { + socket_addr: dns2_sock, + protocol: Protocol::Tcp, + tls_dns_name: None + }); + resolver_config.add_name_server(NameServerConfig { + socket_addr: dns1_sock, + protocol: Protocol::Udp, + tls_dns_name: None + }); + resolver_config.add_name_server(NameServerConfig { + socket_addr: dns2_sock, + protocol: Protocol::Udp, + tls_dns_name: None + }); + } + _ => { + // try UDP first on all other platforms, usually faster + resolver_config.add_name_server(NameServerConfig { + socket_addr: dns1_sock, + protocol: Protocol::Udp, + tls_dns_name: None + }); + resolver_config.add_name_server(NameServerConfig { + socket_addr: dns2_sock, + protocol: Protocol::Udp, + tls_dns_name: None + }); + resolver_config.add_name_server(NameServerConfig { + socket_addr: dns1_sock, + protocol: Protocol::Tcp, + tls_dns_name: None + }); + resolver_config.add_name_server(NameServerConfig { + socket_addr: dns2_sock, + protocol: Protocol::Tcp, + tls_dns_name: None + }); + } + }; + TokioAsyncResolver::tokio(resolver_config, ResolverOpts::default()).await.unwrap() } diff --git a/src/net.rs b/src/net.rs index a0c6244..d42ba30 100644 --- a/src/net.rs +++ b/src/net.rs @@ -46,7 +46,7 @@ pub fn is_private_ip(ip : &String) -> bool { } pub fn ip_gateway() -> String { - let platform: Platform = platform(); + let platform : Platform = platform(); let gateway = match platform { Platform::Windows => { let output = Command::new("C:\\Windows\\System32\\cmd.exe")