网络工具






4.92/5 (8投票s)
一个网络工具应用程序,
引言
网络实用程序是一个简单的应用程序,用于获取系统信息和分析您的网络。它之所以简单,是因为其某些功能可以使用 Windows 命令行工具执行。本文的目的是提供一些关于如何实现某些功能以及所使用的 .NET 命名空间和类的相关信息。
该实用程序有四个独立的功能,每个功能在下面都有详细介绍
- 系统信息
- 网络统计
- Ping
- 端口扫描器
系统信息
关于您的系统的信息,例如机器名称或用户名,可以在 System.Environment
或 System.Windows.Forms.SystemInformation
中找到。这些命名空间提供系统相关信息,无需太多编码。如果您想获取网络信息,例如 MAC 地址,请使用 System.Net.NetworkInformation
。此命名空间有一个方便的类,名为 NetworkInterface
,它有一个 static GetAllNetworkInterfaces()
方法,该方法返回一个 NetworkInterface
集合。通过遍历此集合,您可以检查并获取每个接口的详细信息。网络实用程序应用程序使用这两个命名空间来显示系统和网络信息。
网络统计
网络统计显示活动的 TCP 连接。它是 netstat
命令行工具的简单版本,它提供有关活动连接的更多详细信息。令我惊讶的是,我发现 System.Net.NetworkInformation
具有一个 IPGlobalProperties
类,该类具有一个 static GetIPGlobalProperties()
方法,该方法返回一个 IPGlobalProperties
对象。使用此对象,我能够使用 GetActiveTcpConnections()
方法获取所有活动 TCP 连接的列表。下面的代码演示了如何获取活动 TCP 连接列表并显示远程地址和端口。
IPGlobalProperties properties = IPGlobalProperties.GetIPGlobalProperties();
TcpConnectionInformation[] connections = properties.GetActiveTcpConnections();
foreach (TcpConnectionInformation info in connections)
{
Console.WriteLine(info.RemoteEndPoint.Address.ToString());
Console.WriteLine(info.RemoteEndPoint.Port.ToString());
}
Address
属性是 IPAddress
的一个实例。使用此实例,您可以通过使用 Dns
类来尝试解析其 hostname
,该类位于 System.Net
命名空间中。Dns
类具有一个 static GetHostEntry()
方法,该方法将尝试将 IP 地址解析为 hostname
。应该注意的是,如果您有很多连接,对每个 IP 进行 DNS 查找可能需要一些时间。解析到主机名具有识别连接的优点。
Windows 的 netstat
命令行工具有一个有用的参数 (netstat -o
),它显示连接使用的系统进程 ID (PID
)。使用 PID
,您可以轻松确定应用程序并在需要时采取任何操作。我希望 .NET Framework 有一个可以返回连接的 PID
的类。不幸的是,它没有。但是有一个未管理的 IP 助手 API (GetExtendedTcpTable
函数) 可用于获取每个连接的 PID
。有关此函数的更多信息,请参见 此处。
Ping
ping 的目的是确定主机的可达性以及响应所需的时间。它通过向目标机器发送 Internet 控制消息协议数据包并测量从初始发送到接收响应所花费的时间并记录任何数据包丢失来实现。事实证明,.NET Framework 提供了一个 Ping
类,该类位于 System.Net.NetworkInformation
命名空间中,这使得 ping 非常简单。 MSDN 网站上的 Ping
类参考提供了简单的用法示例。
端口扫描器
扫描开放端口,这看起来像是黑客可能想做的事情,但它对于网络管理员也很有用,他们想监视其系统上哪些端口是开放的。虽然 .NET Framework 没有提供端口扫描类,但实际上编写起来非常简单。使用 System.Net.Sockets
命名空间中的 TcpClient
类,并尝试使用特定端口连接到给定主机,这将表明该端口是否打开。如果建立了连接,则表明在该端口上有一个应用程序正在侦听。
try
{
TcpClient client = new TcpClient("127.0.0.1", "80");
// Port open
}
catch (Exception e){
// port closed.
}
这标志着本文的结束。 请随时留下您的评论和建议。
历史
- 2014 年 6 月 26 日:初始版本