首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 網路工具實戰:本機 IP 查詢、DNS 解析與網段掃描

     編輯:關於C語言

System.Net 命名空間核心類別

類別用途
Dns靜態方法:主機名解析、IP 反查、GetHostEntry
IPAddressIP 位址表示、解析、AddressFamily 判斷 IPv4/IPv6
IPHostEntryDNS 查詢結果容器:HostName、AddressList、Aliases
TcpClient/UdpClient傳輸層通訊
PingICMP 回應測試 (需 .NET 2.0+)

功能 1:查詢本機主機名與所有 IP


using System;
using System.Net;

public class LocalIpQuery
{
    public static void ShowLocalInfo()
    {
        try
        {
            string hostName = Dns.GetHostName();
            Console.WriteLine($"本機主機名:{hostName}");
            
            IPHostEntry host = Dns.GetHostEntry(hostName);
            Console.WriteLine($"正式主機名:{host.HostName}");
            Console.WriteLine($"別名:{string.Join(", ", host.Aliases)}");
            
            foreach (IPAddress ip in host.AddressList)
            {
                string type = ip.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork ? "IPv4" : "IPv6";
                Console.WriteLine($"  {type}:{ip}");
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine($"查詢失敗:{ex.Message}");
        }
    }
}

功能 2:域名解析 (正向查詢)


public static void ResolveDomain(string domain)
{
    try
    {
        IPHostEntry entry = Dns.GetHostEntry(domain);
        Console.WriteLine($"{domain} → {entry.HostName}");
        foreach (IPAddress ip in entry.AddressList)
            Console.WriteLine($"  {ip.AddressFamily}:{ip}");
    }
    catch (Exception ex)
    {
        Console.WriteLine($"解析失敗:{ex.Message}");
    }
}

功能 3:IP 反向查詢 (PTR 記錄)


public static void ReverseLookup(string ipString)
{
    try
    {
        IPAddress ip = IPAddress.Parse(ipString);
        IPHostEntry entry = Dns.GetHostEntry(ip);
        Console.WriteLine($"{ip} → {entry.HostName}");
    }
    catch (Exception ex)
    {
        Console.WriteLine($"反查失敗:{ex.Message}");
    }
}

功能 4:網段掃描 — 多執行緒平行掃描


using System;
using System.Net;
using System.Net.NetworkInformation;
using System.Threading.Tasks;

public class NetworkScanner
{
    public async Task ScanAsync(string baseIp, int start, int end, int timeoutMs = 200)
    {
        // 解析基底 IP (例如 "192.168.1")
        string[] parts = baseIp.Split('.');
        if (parts.Length != 3) throw new ArgumentException("基底 IP 格式錯誤,需為 x.x.x");
        
        string prefix = $"{parts[0]}.{parts[1]}.{parts[2]}.";
        
        var tasks = new List();
        var results = new System.Collections.Concurrent.ConcurrentBag();
        
        for (int i = start; i <= end; i++)
        {
            int octet = i;
            string targetIp = prefix + octet;
            
            tasks.Add(Task.Run(() =>
            {
                try
                {
                    // 方法 1:Ping 測試 (快速、不需權限)
                    using (var ping = new Ping())
                    {
                        PingReply reply = ping.Send(targetIp, timeoutMs);
                        if (reply.Status == IPStatus.Success)
                        {
                            // 方法 2:嘗試 DNS 反查取得主機名
                            string hostName = "";
                            try
                            {
                                IPHostEntry entry = Dns.GetHostEntry(targetIp);
                                hostName = $" ({entry.HostName})";
                            }
                            catch { /* 忽略反查失敗 */ }
                            
                            results.Add($"[線上] {targetIp}{hostName} - 回應時間 {reply.RoundtripTime}ms");
                        }
                    }
                }
                catch { /* 忽略單一 IP 錯誤 */ }
            }));
        }
        
        await Task.WhenAll(tasks);
        
        // 輸出結果 (依 IP 排序)
        foreach (var r in results.OrderBy(x => x))
            Console.WriteLine(r);
    }
}

WinForms 整合範例 (非同步 UI 不凍結)


public partial class ScannerForm : Form
{
    private NetworkScanner scanner = new NetworkScanner();
    private CancellationTokenSource cts;
    
    private async void btnScan_Click(object sender, EventArgs e)
    {
        btnScan.Enabled = false;
        btnCancel.Enabled = true;
        txtLog.Clear();
        cts = new CancellationTokenSource();
        
        try
        {
            string baseIp = txtBaseIp.Text;  // 如 "192.168.1"
            int start = int.Parse(txtStart.Text);
            int end = int.Parse(txtEnd.Text);
            
            await scanner.ScanAsync(baseIp, start, end, 200, cts.Token, 
                msg => Invoke(() => txtLog.AppendText(msg + Environment.NewLine)));
        }
        catch (OperationCanceledException)
        {
            Log("掃描已取消");
        }
        finally
        {
            btnScan.Enabled = true;
            btnCancel.Enabled = false;
        }
    }
    
    private void btnCancel_Click(object sender, EventArgs e) => cts?.Cancel();
    
    private void Log(string msg) => txtLog.AppendText($"[{DateTime.Now:HH:mm:ss}] {msg}\r\n");
}

進階:掃描策略比較

方法優點缺點適用場景
Ping (ICMP)快、標準、跨平台防火牆可能封鎖、無法取得服務資訊主機存活探測
TCP Connect 掃描確認特定埠開放、應用層驗證較慢、完整三向交握服務發現、弱點掃描
TCP SYN (半開放)快、隱蔽、不建立完整連線需原始 Socket 權限 (Root/Admin)專業滲透測試
UDP 掃描發現 UDP 服務 (DNS、SNMP、DHCP)不可靠、回應機制不一特定服務探測

安全與法律提醒

  • 僅掃描授權網路:未經授權掃描可能違反《電腦犯罪條例》等法規
  • 企業環境需獲網管同意,避免觸發 IDS/IPS 警報
  • 掃描頻率過高可能造成網路擁塞或服務拒絕
  • 生產環境建議使用專業工具 (Nmap、Masscan、Angry IP Scanner)

本章小結

  • Dns.GetHostEntry 整合正向/反向查詢,取代舊版 GetHostByName/Address
  • IPAddress 提供 IPv4/IPv6 統一表示、解析、格式化
  • 網段掃描核心:Ping 非同步平行 + 選擇性 DNS 反查
  • WinForms/UI 應用必須使用非同步模式避免凍結介面
  • 網路探測必須遵守法律與道德規範,僅限授權範圍
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved