对一个网段范围内的计算机的在线状态进行【数据采集】、【数据挖掘(分析、加工处理)】,最终得到所有在线计算机的数据。技术范围涉及:①命令行工具ping、find ②记事本 ③Excel电子表格软件 ④wps文字处理软件 ⑤VS编程
文章目录
情景描述
朋友A君是教师,在机房上课时需要远程连接办公室笔记本,但笔记本的IP是动态获取的。知道IP地址范围:172.20.21.1~172.20.21.254,网关:172.20.21.254,怎么才能快速地查到自己计算机的IP地址呢?一、远程连接的正确手势
如果一个个的试,需要使用命令:
正常的情况如下:
错误的情况如下:
这种方式运气不好的情况,需要作253次远程连接操作,需要大量的时间作测试,显然不是最好的方式。
下面就把A君的解决方法呈现一下。
二、探测远程的计算机是否在线可用Ping
1.使用网络Ping命令可以判断一台计算机存在。
这是最初的一个想法:
这是Ping不通的,原因可能是计算机不存在,也可能开了防火墙,是防Ping的,但由于A君是关防火墙的。所以这个因素可以不考虑。
下面的是能正常Ping通的情况:
这台计算机如果Ping通,那么就可以作下一步的远程测试目标了。
c:\>mstsc /v:172.20.21.43
2.批处理ping 172.20.21.1~172.20.21.253
单独一行行ping这个范围也需要很多时间(手工操作效率很低)。就考虑生成批处理。
(1)使用Excel生成Ping命令行
(2)导出Ping命令行到文本文件
(3)修改pingBatch.txt文件扩展名为.bat
文件修改后,双击执行pingBatch.bat
(4)在命令窗口可按Ctrl+C中断批处理执行
(5)改进Ping命令,优化效率
我们需要学习一下ping命令的参数:
实践一下这种方法:
这样挺有效,降低了3/4的时间。优化有效!
(6)改进pingBatch.bat文件内容
可以直接右击文件【pingBatch.bat】》选择【编辑】,会用记事本打开。按【CTRL+H】进入替换操作窗口。
选择【全部替换】,结果如下图:
(7)使用重定向符【 > 】修改命令输出
重试执行批处理,效果明显好了。但怎么看结果呢,总不能在命令窗口直接看吧。要的结果是只显示能正常ping通的地址。所以需要把显示结果存放到文件里,命令行的重定向符【 > 】可以完成这个功能。
(8)查看重定向文件:result.txt
正是ping的结果呢?
可以换一个地址ping ,文件结果变成了:
怎么把所有ping 的结果都保存到这个文件中呢?
(9)把重定向符号由【>】改成【>>】
(10)用wps再次修改pingBatch.bat
(11)查找替换的结果
【全部替换】,并保存。
(12)重新执行pingBatch.bat文件
现在可以泡杯茶,慢慢等待了…
执行完毕,再次打开result.txt文件:
正常ping通的信息和没有ping通的IP区别是,能ping通的有:
来自 172.20.21.10 的回复: 字节=32 时间<1ms TTL=128
(13)用Find命令过滤结果文件result.txt
针对获取到信息,如何取出需要的内容,这涉及到数据加工处理。这里使用DOS命令find
(14)Find命令的用法
在find第一个参数指示【特征字符串内容】:TTL
第二个参数,指示对result.txt文件操作,要求带上【路径】。
C:\>find "TTL" c:\result.txt
好了,这就是常规使用DOS命令完成对某一网段探测的结果,那么A君的笔记本肯定是这几个IP中的一个,每个远程连接一下,应该很快就能得到结果。
三、使用C#编程来完成这个功能
1.程序代码(控制台程序)如下
using System;
using System.Diagnostics;
using System.IO;
using System.Text;
namespace NetPing
{
class Program
{
static void Main(string[] args)
{
FileStream fs = new FileStream("c:\\result.txt", FileMode.OpenOrCreate, FileAccess.Write);
StreamWriter sw = new StreamWriter(fs,Encoding.Default);
Console.WriteLine("正在处理中,请不要关闭窗口!");
Process P = new Process();
P.StartInfo.UseShellExecute = false;
P.StartInfo.FileName = "cmd.exe";
P.StartInfo.Arguments = "";
P.StartInfo.RedirectStandardError = true;
P.StartInfo.RedirectStandardInput = true;
P.StartInfo.RedirectStandardOutput = true;//标准输出重定向
P.OutputDataReceived += new DataReceivedEventHandler((sender, e)=>
{
if (!string.IsNullOrEmpty(e.Data)&&e.Data.Contains("TTL"))
sw.WriteLine(e.Data);
});
P.Start();
P.BeginOutputReadLine();
for(int i=1;i<=253;i++)
{
P.StandardInput.WriteLine("ping -n 1 172.20.21." + i.ToString());
}
P.StandardInput.WriteLine("exit");
P.StandardInput.Flush();
P.WaitForExit();
P.Close();
sw.Close();
fs.Close();
Console.WriteLine(@"处理完毕,请打开c:\result.txt继续处理!");
}
}
}
(1)读取StandardOutput流时,这里采用了异步方式,原因是同步方式读取流和写入流会形成依赖关系,容易形成死锁。
P.OutputDataReceived += new DataReceivedEventHandler((sender, e)=>
{
if (!string.IsNullOrEmpty(e.Data)&&e.Data.Contains("TTL"))
sw.WriteLine(e.Data);
});
P.Start();
P.BeginOutputReadLine();
(2)采用循环方式产生 P.StandardInput.WriteLine()标准输入指令
for(int i=1;i<=253;i++)
{
P.StandardInput.WriteLine("ping -n 1 172.20.21." + i.ToString());
}
2.程序执行直接得到结果文件
程序内部即可对ping命令的输出进行处理,只保留有用的内容,最后结果保存到C:\result.txt文件
总结
首先,这是一个完整的发现问题、分析问题、解决问题的全过程。往往问题的最终解决方法并不是一发现问题就找到的。而是在问题之初有了一个模糊的想法,后面要把这个想法贯彻到底就必须不断的发现新问题并逐步解决、优化。 同时在解决这个问题之后,已经考虑再次优化这个C#程序。(希望看到这篇文章后关注并评论,将根据评论情况决定是否写下一步方案的文章)下一步的方案:《C#多线程方式探测未知网络环境》。
同时,由本篇文章的问题情景,再次深入提出:
①在已知学校所有机房网段的基础之上,如何快速了解某一时段有XX个机房正在使用?②如果提供单位所有的网段,能否在半小时之内掌握所有计算机的在线情况?