C#程序探测未知网络环境的神操作

对一个网段范围内的计算机的在线状态进行【数据采集】、【数据挖掘(分析、加工处理)】,最终得到所有在线计算机的数据。技术范围涉及:①命令行工具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个机房正在使用?

②如果提供单位所有的网段,能否在半小时之内掌握所有计算机的在线情况?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

寒茗清雾

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值