atopx May 02, 2025 #rust #network
使用DNS获取公网IP的优势:
依赖环境:
[dependencies]
hickory-proto = "0.25"
hickory-resolver = "0.25"
tokio = { version = "1", features = ["macros"] }
功能代码:
use std::net::{Ipv4Addr, SocketAddr, SocketAddrV4};
use hickory_proto::xfer::Protocol;
use hickory_resolver::{
config::{NameServerConfig, ResolverConfig},
name_server::TokioConnectionProvider,
ResolveError, ResolveErrorKind, Resolver,
};
const OPENDNS_ADDR: SocketAddr =
SocketAddr::V4(SocketAddrV4::new(Ipv4Addr::new(208, 67, 222, 222), 53));
const OPENDNS_DOMAIN: &str = "myip.opendns.com";
async fn public_ip() -> Result<String, ResolveError> {
let mut config = ResolverConfig::new();
config.add_name_server(NameServerConfig::new(OPENDNS_ADDR, Protocol::Udp));
let resolver =
Resolver::builder_with_config(config, TokioConnectionProvider::default()).build();
resolver
.lookup_ip(OPENDNS_DOMAIN)
.await?
.iter()
.next()
.map(|ip| ip.to_string())
.ok_or_else(|| ResolveErrorKind::Message("no IP found").into())
}
#[tokio::main]
async fn main() {
let ip = public_ip().await.unwrap();
println!("{}", ip);
}