c# 多任务网段扫描练习(有单线程、多线程、线程池、多任务)

前台界面如图:

前台代码:

<Window x:Class="A._2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:A._2"
        mc:Ignorable="d"
        Title="上机练习2" Height="350" Width="688.598">
    <Grid>
        <GroupBox x:Name="groupBox" Header="扫描的IP地址范围" HorizontalAlignment="Left" Margin="34,22,0,0" VerticalAlignment="Top" Height="95" Width="637" BorderThickness="3">
            <Grid HorizontalAlignment="Left" Height="77" Margin="10,0,0,-4" VerticalAlignment="Top" Width="600">
                <Label x:Name="label1" Content="地址前缀:" HorizontalAlignment="Left" Margin="19,26,0,0" VerticalAlignment="Top"/>
                <Label x:Name="label2" Content="起始值:" HorizontalAlignment="Left" Margin="184,28,0,0" VerticalAlignment="Top"/>
                <Label x:Name="label3" Content="终止值:" HorizontalAlignment="Left" Margin="338,28,0,0" VerticalAlignment="Top"/>
                <TextBox x:Name="textBox1" HorizontalAlignment="Left"  Margin="93,30,0,0" TextWrapping="Wrap" Text="请输入" VerticalAlignment="Top" Width="86" Height="20" Background="#FFBBB5B5"/>
                <TextBox x:Name="textBox2" HorizontalAlignment="Left" Margin="238,30,0,0" TextWrapping="Wrap" Text="请输入" VerticalAlignment="Top" RenderTransformOrigin="2.389,0.574" Width="86" Height="20" Background="#FFBBB5B5"/>
                <TextBox x:Name="textBox3" HorizontalAlignment="Left" Margin="392,30,0,0" TextWrapping="Wrap" Text="请输入" VerticalAlignment="Top" RenderTransformOrigin="2.389,0.574" Width="86" Height="20" Background="#FFBBB5B5"/>
                <Button x:Name="begin" Content="开始扫描" HorizontalAlignment="Left" Margin="505,28,0,0" VerticalAlignment="Top" Width="75"/>
            </Grid>
        </GroupBox>
        <GroupBox x:Name="groupBox1" Header="扫描信息" HorizontalAlignment="Left" Margin="34,145,0,0" VerticalAlignment="Top" Height="157" Width="637" BorderThickness="3">
            <ListBox x:Name="listBox" HorizontalAlignment="Left" Height="131" VerticalAlignment="Top" Width="627" Margin="0,0,-2,0"/>
        </GroupBox>
        <Label x:Name="error" Content="IP地址有错,请更正!" HorizontalAlignment="Left" Margin="0,122,0,0" VerticalAlignment="Top" Width="681" Background="#FFD43939"  Foreground="#FFF3ECEC" Visibility="Hidden" HorizontalContentAlignment="Center"/>
    </Grid>
</Window>

后台代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace A._2
{
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            begin.Click += Begin_Click;
        }

        IPAddress IpStart, IpEnd;//两个IPAddress类型的变量,分别用来保存开始的IP地址和结束的IP的地址

       /**
        * 开始扫描按钮点击事件方法
        */
        private void Begin_Click(object sender, RoutedEventArgs e)
        {
            listBox.Items.Clear();//将listbox控件清空
            string input1 = textBox1.Text;
            string input2 = textBox2.Text;
            string input3 = textBox3.Text;
            int int_input2 = int.Parse(input2);//将第二个输入框的内容转化为int类型
            int int_input3 = int.Parse(input3);//将第三个输入框的内容转化为int类型
            int count=0;//计数器
            int k=input1.Length;//记录input1的长度

            if(!input1[k-1].Equals('.'))//判断第一个输入框有没有在最后加‘.',没有给他补上  代码的健壮性
            {         
                input1 += ".";
            }
          
            /*
             *将输入的内容进行拼接并转化为地址,判断第二个输入框是否小于第三个输入框
             * 如果不能正确的转化为IP地址或者第二个框内容不小于第三个框,显示错误提示信息
             */
            if(IPAddress.TryParse(input1+input2,out IpStart) && IPAddress.TryParse(input1+input3,out IpEnd) &&(int_input2<=int_input3) )
            {
                count = int_input3 - int_input2 +1;
                tips_hidden();//输入正确,隐藏错误提示信息
            }else{
                tips();//输入错误,显示错误提示信息
            }

           for(int i=0;i<count;i++)
            {
                string ipString = input1 + (int.Parse(input2) +i);
                IPAddress ip = IPAddress.Parse(ipString);

                 // scan(ip); //主线程

                /*Thread t = new Thread(scan); 多线程
                  t.Start(ip);                 多线程*/

                // ThreadPool.QueueUserWorkItem(new WaitCallback(scan), ip);//线程池

                Task.Run(() => scan(ip));//多任务
             
            }
            

        }


        public void tips()//显示输入错误的信息
        {
            error.Visibility = Visibility.Visible;
        }

        public void tips_hidden()//隐藏输入错误提示信息
        {
            error.Visibility = Visibility.Hidden;
        }

        public void scan(Object ip)//扫描方法并记录扫描时间
        {
            DateTime timeBegin = DateTime.Now;//记录开始时间
            IPAddress ipAddress = (IPAddress)ip;//强制类型转换
            string hostName;//主机名

            try   //捕获异常
            {
                hostName = Dns.GetHostEntry(ipAddress).HostName;//通过Dns类获取主机名
            }
            catch (Exception e)
            {

                hostName = "(不在线)";
            }

            DateTime timeEnd = DateTime.Now;//记录结束时间
            TimeSpan timeSpan = timeEnd - timeBegin;//时间间隔

            //WPF调度器 里面是lambda表达式
            listBox.Dispatcher.Invoke(() => listBox.Items.Add("扫描地址:" + ip + "," + "扫描时间:" + timeSpan.Milliseconds + "毫秒," + "主机DNS名称:" + hostName));


        }


    }
}

  • 19
    点赞
  • 78
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值