첨부 실행 코드는 나눔고딕코딩 폰트를 사용합니다.
유용한 소스 코드가 있으면 icodebroker@naver.com으로 보내주시면 감사합니다.
블로그 자료는 자유롭게 사용하세요.

■ 포트 스캔하기

----------------------------------------------------------------------------------------------------


TestPortScanner.zip


MainForm.cs

 

 

using System;

using System.Net;

using System.Net.Sockets;

using System.Threading;

using System.Windows.Forms;

 

namespace TestPortScanner

{

    /// <summary>

    /// 메인 폼

    /// </summary>

    public partial class MainForm : Form

    {

        //////////////////////////////////////////////////////////////////////////////////////////////////// Delegate

        ////////////////////////////////////////////////////////////////////////////////////////// Private

 

        #region 스캔 진행 바 값 설정하기 대리자 - SetScanProgressBarValueDelegate(value)

 

        /// <summary>

        /// 스캔 진행 바 값 설정하기 대리자

        /// </summary>

        /// <param name="value"></param>

        private delegate void SetScanProgressBarValueDelegate(int value);

 

        #endregion

        #region 리스트 뷰 항목 추가하기 대리자 - AddListViewItemDelegate(port, status)

 

        /// <summary>

        /// 리스트 뷰 항목 추가하기 대리자

        /// </summary>

        /// <param name="port">포트</param>

        /// <param name="status">상태</param>

        private delegate void AddListViewItemDelegate(string port, string status);

 

        #endregion

        #region 컨트롤들 이용 가능하게 하기 - EnableControlsDelegate()

 

        /// <summary>

        /// 컨트롤들 이용 가능하게 하기

        /// </summary>

        private delegate void EnableControlsDelegate();

 

        #endregion

 

        //////////////////////////////////////////////////////////////////////////////////////////////////// Field

        ////////////////////////////////////////////////////////////////////////////////////////// Private

 

        #region Field

 

        /// <summary>

        /// 리스트 뷰 항목 추가하기 대리자

        /// </summary>

        private AddListViewItemDelegate addListViewItemDelegate = null;

 

        /// <summary>

        /// 스캔 진행 바 값 델리게이트

        /// </summary>

        private SetScanProgressBarValueDelegate setScanProgressBarValueDelegate = null;

 

        /// <summary>

        /// 컨트롤들 이용 가능하게 하기 델리게이트

        /// </summary>

        private EnableControlsDelegate enableControlsDelegate = null;

 

        /// <summary>

        /// 스캔 IP 주소 문자열

        /// </summary>

        private string scanIPAddressString = string.Empty;

 

        /// <summary>

        /// 시작 포트

        /// </summary>

        private int startPort = 0;

 

        /// <summary>

        /// 종료 포트

        /// </summary>

        private int endPort = 0;

 

        /// <summary>

        /// 스캔 IP 주소

        /// </summary>

        private IPAddress scanIPAddress = null;

 

        /// <summary>

        /// 스캔 스레드

        /// </summary>

        private Thread scanThread = null;

 

        #endregion

 

        //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor

        ////////////////////////////////////////////////////////////////////////////////////////// Public

 

        #region 생성자 - MainForm()

 

        /// <summary>

        /// 생성자

        /// </summary>

        public MainForm()

        {

            InitializeComponent();

        }

 

        #endregion

 

        //////////////////////////////////////////////////////////////////////////////////////////////////// Method

        ////////////////////////////////////////////////////////////////////////////////////////// Private

        //////////////////////////////////////////////////////////////////////////////// Event

 

        #region 폼 로드시 처리하기 - Form_Load(sender, e)

 

        /// <summary>

        /// 폼 로드시 처리하기

        /// </summary>

        /// <param name="sender">이벤트 발생자</param>

        /// <param name="e">이벤트 인자</param>

        private void Form_Load(object sender, EventArgs e)

        {

            this.addListViewItemDelegate         = new AddListViewItemDelegate(AddListViewItem);

            this.setScanProgressBarValueDelegate = new SetScanProgressBarValueDelegate(SetScanProgressBarValue);

            this.enableControlsDelegate          = new EnableControlsDelegate(EnableControls);

        }

 

        #endregion

        #region 스캔 버튼 클릭시 처리하기 - scanButton_Click(sender, e)

 

        /// <summary>

        /// 스캔 버튼 클릭시 처리하기

        /// </summary>

        /// <param name="sender">이벤트 발생자</param>

        /// <param name="e">이벤트 인자</param>

        private void scanButton_Click(object sender, EventArgs e)

        {

            this.scanIPTextBox.Enabled    = false;

            this.startPortTextBox.Enabled = false;

            this.endPortTextBox.Enabled   = false;

            this.scanButton.Enabled       = false;

 

            this.scanIPAddressString     = this.scanIPTextBox.Text;

            this.startPort               = Convert.ToInt32(this.startPortTextBox.Text);

            this.endPort                 = Convert.ToInt32(this.endPortTextBox.Text);

            this.scanProgressBar.Minimum = this.startPort;

            this.scanProgressBar.Maximum = this.endPort;

 

            this.listView.Items.Clear();

 

            this.scanThread = new Thread(Scan);

 

            this.scanThread.Start();

        }

 

        #endregion

 

        //////////////////////////////////////////////////////////////////////////////// Function

 

        #region 리스 뷰 항목 추가하기 - AddListViewItem(port, status)

 

        /// <summary>

        /// 리스 뷰 항목 추가하기

        /// </summary>

        /// <param name="port">포트</param>

        /// <param name="status">상태</param>

        private void AddListViewItem(string port, string status)

        {

            this.listView.Items.Add(new ListViewItem(new string[] { port, status }));

        }

 

        #endregion

        #region 스캔 진행 바 값 설정하기 - SetScanProgressBarValue(value)

 

        /// <summary>

        /// 스캔 진행 바 값 설정하기

        /// </summary>

        /// <param name="value"></param>

        private void SetScanProgressBarValue(int value)

        {

            this.scanProgressBar.Value = value;

        }

 

        #endregion

        #region 컨트롤들 이용 가능하게 하기 - EnableControls()

 

        /// <summary>

        /// 컨트롤들 이용 가능하게 하기

        /// </summary>

        private void EnableControls()

        {

            this.scanIPTextBox.Enabled    = true;

            this.startPortTextBox.Enabled = true;

            this.endPortTextBox.Enabled   = true;

            this.scanButton.Enabled       = true;

        }

 

        #endregion

        #region 스캔하기 - Scan()

 

        /// <summary>

        /// 스캔하기

        /// </summary>

        private void Scan()

        {

            this.scanIPAddress = IPAddress.Parse(this.scanIPAddressString);

 

            for(int port = this.startPort; port <= this.endPort; port++)

            {

                Invoke(this.setScanProgressBarValueDelegate, port);

 

                try

                {

                    IPEndPoint ipEndPoint = new IPEndPoint(this.scanIPAddress, port);

 

                    Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

 

                    socket.Connect(ipEndPoint);

 

                    Invoke(this.addListViewItemDelegate, port.ToString(), "OPEN");

 

                    continue;

                }

                catch(SocketException socketException)

                {

                    if(socketException.ErrorCode != 10061) // 대상 컴퓨터에서 연결을 거부하지 않은 경우

                    {

                        MessageBox.Show(this, socketException.Message, "Error");

                    }

                }

 

                //Invoke(this.addListViewItemDelegate, port.ToString(), "CLOSE");

            }

 

            Invoke(this.enableControlsDelegate);

 

            this.scanThread.Abort();

        }

 

        #endregion

    }

}

 

----------------------------------------------------------------------------------------------------

Posted by 사용자 icodebroker

댓글을 달아 주세요