• C# IP地址段端口扫描器


    前言:以前偶尔看博客园,到后来经常看,现在是天天看,很佩服一些大牛们,也很感谢分享自己学习成果的朋友们,两年前也写过两三篇就停了,也是一直索取没有回报。本篇也参照了各位的成果,再次感谢。扫描器代码

    近几年工作经常使用RFID识读器,智能家居网关,温湿度传感器,一般是有串口和网口,由于现场原因一般较少使用串口,大多使用网口。连接方法是IP地址和端口,有的设备带搜索软件,有的就不带。经常测试环境和现场来回用,难免记混。最近使用的一款RFID识读器使用的ZN-100以太网口转串口模块,自带的搜索软件(ZNetCom Utility)就不错,搜索速度也很快。(如下图)

    ZN-100

    就想着自己也开发一个,首先IP段和端口能够自定义,方便使用;搜索速度一定要快,我急性子要不等不急,这就要使用多线程和异步。先上图。

    ScanIP1

    ScanIP2

    一、主要扫描方法:

        #region 扫描方法
    
            public void Scan(string m_host, int m_port)
            {
                //我们直接使用比较高级的TcpClient类
                TcpClient tc = new TcpClient();
                //设置超时时间
                tc.SendTimeout = tc.ReceiveTimeout = 2000;
    
                try
                {
                    //同步方法
                      //IPAddress ip = IPAddress.Parse(host);
                    //IPEndPoint IPendp = new IPEndPoint(ip, port);
                    //tc.Connect(IPendp);
    
                    //异步方法
                    IAsyncResult oAsyncResult = tc.BeginConnect(m_host, m_port, null, null);
                    oAsyncResult.AsyncWaitHandle.WaitOne(1000, true);//1000为超时时间 
    
                    if (tc.Connected)
                    {
                        //如果连接上,证明此端口为开放状态
                           UpdateListBox(listBox1, m_host + ":" + m_port.ToString());
                    }
                }
                catch (System.Net.Sockets.SocketException e)
                {
                    //容错处理
                    //MessageBox.Show("Port {0} is closed", host.ToString());
                    //Console.WriteLine(e.Message);
                }
                finally
                {              
                    tc.Close();
                    tc = null;                
                    scannedCount++;
                    runningThreadCount--;
    
                }
            }
            #endregion
    如果使用同步方法会有明显的卡顿,用户体验不好;使用异步感觉很流畅,很爽,自己可以注释代码亲测。
    //同步方法
        //IPAddress ip = IPAddress.Parse(host);
        //IPEndPoint IPendp = new IPEndPoint(ip, port);
        //tc.Connect(IPendp);
    
        //异步方法 记得是一位朋友在回复中写的,回复也要看呀
         IAsyncResult oAsyncResult = tc.BeginConnect(m_host, m_port, null, null);
         oAsyncResult.AsyncWaitHandle.WaitOne(1000, true);//1000为超时时间 
    
    二、异步调用带参数调用,就不多说了,可以自己去研究。
    //带参数的多线程执行
        Thread thread = new Thread(() => Scan(host, port));
        thread.IsBackground = true;
        thread.Start();
    三、设置IP地址段和端口使用参数传值,在此不多说了。
     
    扫描器代码
     
     
  • 相关阅读:
    【程序2】
    【程序1】
    基数排序
    归并排序
    选择排序
    leetcode15
    leetcode221
    leetcode322
    leetcode921
    leetcode922
  • 原文地址:https://www.cnblogs.com/wk986/p/2960529.html
Copyright © 2020-2023  润新知