如何在Rust中根据名称查询服务器?

Rust 服务器查询工具

rust知道名字怎么查服务器

下面是一个使用 Rust 和 Tauri 构建的简单服务器查询工具,可以通过域名查询服务器的 IP 地址和相关信息。

思路分析

1、使用 Tauri 创建桌面应用界面

2、通过 Rust 的后端代码执行网络查询

3、使用std::net::ToSocketAddrs 进行 DNS 解析

rust知道名字怎么查服务器

4、添加简单的 GUI 界面让用户输入域名并查看结果

代码实现

Cargo.toml 中添加依赖:

[dependencies]
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
tauri = { version = "1.0", features = ["api-all"] }

下面是完整的 Rust 代码:

use serde::{Deserialize, Serialize};
use std::net::ToSocketAddrs;
use tauri::Window;
// 前端传递的查询参数
#[derive(Deserialize)]
struct QueryRequest {
    domain: String,
}
// 返回给前端的响应
#[derive(Serialize)]
struct QueryResponse {
    success: bool,
    ips: Vec<String>,
    error: Option<String>,
}
// 执行服务器查询的函数
#[tauri::command]
fn query_server(window: Window, request: QueryRequest) -> QueryResponse {
    println!("查询域名: {}", request.domain);
    
    // 尝试解析域名
    let socket_addrs = format!("{}:0", request.domain).to_socket_addrs();
    
    match socket_addrs {
        Ok(addrs) => {
            let ips: Vec<String> = addrs
                .map(|addr| addr.ip().to_string())
                .collect();
            
            QueryResponse {
                success: true,
                ips,
                error: None,
            }
        }
        Err(e) => QueryResponse {
            success: false,
            ips: Vec::new(),
            error: Some(format!("解析失败: {}", e)),
        },
    }
}
fn main() {
    tauri::Builder::default()
        .invoke_handler(tauri::generate_handler![query_server])
        .run(tauri::generate_context!())
        .expect("运行 Tauri 应用时出错");
}

前端界面 (HTML + JS)

rust知道名字怎么查服务器
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>服务器查询工具</title>
    <style>
        body {
            font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
            max-width: 600px;
            margin: 0 auto;
            padding: 20px;
            background-color: #f5f5f5;
            color: #333;
        }
        h1 {
            text-align: center;
            color: #2c3e50;
        }
        .input-group {
            display: flex;
            margin-bottom: 20px;
        }
        input {
            flex: 1;
            padding: 10px;
            border: 1px solid #ddd;
            border-radius: 4px 0 0 4px;
            font-size: 16px;
        }
        button {
            padding: 10px 20px;
            background-color: #3498db;
            color: white;
            border: none;
            border-radius: 0 4px 4px 0;
            cursor: pointer;
            font-size: 16px;
        }
        button:hover {
            background-color: #2980b9;
        }
        .result {
            background-color: white;
            padding: 15px;
            border-radius: 4px;
            box-shadow: 0 2px 4px rgba(0,0,0,0.1);
        }
        .ip-list {
            list-style-type: none;
            padding: 0;
        }
        .ip-list li {
            padding: 8px;
            border-bottom: 1px solid #eee;
        }
        .ip-list li:last-child {
            border-bottom: none;
        }
        .error {
            color: #e74c3c;
            padding: 10px;
            background-color: #fadbd8;
            border-radius: 4px;
        }
    </style>
</head>
<body>
    <h1>服务器查询工具</h1>
    
    <div class="input-group">
        <input type="text" id="domainInput" placeholder="输入域名 ( example.com)" />
        <button id="queryButton">查询</button>
    </div>
    
    <div id="resultContainer" class="result" style="display: none;">
        <h3>查询结果:</h3>
        <ul id="ipList" class="ip-list"></ul>
        <div id="errorMessage" class="error" style="display: none;"></div>
    </div>
    <script>
        const { invoke } = window.__TAURI__.invoke;
        
        document.getElementById('queryButton').addEventListener('click', async () => {
            const domain = document.getElementById('domainInput').value.trim();
            if (!domain) {
                alert('请输入域名');
                return;
            }
            
            try {
                const response = await invoke('query_server', { 
                    request: { domain } 
                });
                
                const resultContainer = document.getElementById('resultContainer');
                const ipList = document.getElementById('ipList');
                const errorMessage = document.getElementById('errorMessage');
                
                resultContainer.style.display = 'block';
                errorMessage.style.display = 'none';
                ipList.innerHTML = '';
                
                if (response.success) {
                    if (response.ips.length === 0) {
                        ipList.innerHTML = '<li>未找到IP地址</li>';
                    } else {
                        response.ips.forEach(ip => {
                            const li = document.createElement('li');
                            li.textContent = ip;
                            ipList.appendChild(li);
                        });
                    }
                } else {
                    errorMessage.style.display = 'block';
                    errorMessage.textContent = response.error;
                }
            } catch (error) {
                console.error('查询失败:', error);
                alert('查询失败: ' + error);
            }
        });
        
        // 支持按回车键触发查询
        document.getElementById('domainInput').addEventListener('keypress', (e) => {
            if (e.key === 'Enter') {
                document.getElementById('queryButton').click();
            }
        });
    </script>
</body>
</html>

使用说明

1、确保已安装 Rust 和 Tauri 的开发环境

2、将上述代码保存到相应文件

3、运行tauri dev 启动应用

4、在输入框中输入域名并点击查询按钮

5、应用将显示该域名解析出的所有 IP 地址

注意事项

- 这个应用只提供基本的 DNS 解析功能

- 某些服务器可能配置了多个 IP 地址(IPv4 和 IPv6)

- 复杂的网络环境可能会影响查询结果

这个示例展示了如何使用 Rust 和 Tauri 创建一个简单的桌面应用程序来查询服务器的 IP 地址,您可以根据需要扩展功能,例如添加端口扫描、HTTP 请求测试等功能。

文章摘自:https://idc.huochengrm.cn/fwq/15853.html

评论