System.Net 命名空間核心類別
| 類別 | 用途 |
Dns | 靜態方法:主機名解析、IP 反查、GetHostEntry |
IPAddress | IP 位址表示、解析、AddressFamily 判斷 IPv4/IPv6 |
IPHostEntry | DNS 查詢結果容器:HostName、AddressList、Aliases |
TcpClient/UdpClient | 傳輸層通訊 |
Ping | ICMP 回應測試 (需 .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 應用必須使用非同步模式避免凍結介面
- 網路探測必須遵守法律與道德規範,僅限授權範圍