背景
最近使用tauri开发的一款工具中需要根据网络环境判断限制软件功能的使用,记录下如何获取IP来判断是不是处在特定网络。
实现方式
通过tauri
的command
来获取本机IP
,前端使用tauri
的api
获取公网IP
。
参考代码
主程序 src-tauri/src/main.rs
输入如下参考代码:
- 定义一个函数
get_local_ip
用于获取本机IP
use std::net::TcpStream;
use std::net::IpAddr;
#[tauri::command]
fn get_ip() -> String {
let local_ip = get_local_ip().unwrap();
format!("{}", local_ip)
}
fn get_local_ip() -> Result<IpAddr, Box<dyn std::error::Error>> {
let socket = std::net::UdpSocket::bind("0.0.0.0:0")?;
socket.connect("8.8.8.8:80")?;
let local_ip = socket.local_addr()?.ip();
Ok(local_ip)
}
- 在
main
函数中注册调用该函数的命令:
fn main() {
tauri::Builder::default()
.invoke_handler(tauri::generate_handler![get_ip])
.run(tauri::generate_context!())
.expect("error while running tauri application");
}
- 在前端页面调用该命令获取本机IP:
const localIp = ref("");
async function getIp() {
localIp.value = await invoke("get_ip");
}
- 在页面中引入
tauri
的http
,请求第三方接口获取出网IP。
import { http } from "@tauri-apps/api";
const outerIp = ref("");
async function getOuterIp() {
return await http.fetch('https://ifconfig.me/ip', {
method: "get",
responseType: 2,
});
}
let ipRes = await getOuterIp()
outerIp.value = ipRes.data
然后我们就可以拿到本机IP及公网IP了。
参考资料
- command 系统
- tauri http client