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地址段和端口使用參數傳值,在此不多說了。
 
掃描器代碼
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM