Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Распределённые приложения и сеть > Опрос портов на С#.


Автор: Joker07 9.6.2008, 22:02
Люди, помогите студенту разобраться в коде. Программа работает, назначение - опрос портов. Подправьте или добавьте комменты, пж-та.
Прога легкая, я просто в C#/С++ не шарю, но эту прогу сдать надо, а препод предирается к каждой строчке. Вот и разбираю по слогам...
Код программы:
Код

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.Threading;

namespace PortScan // объявление собственного пространства имен PortScan
{
    /// <summary>
    /// Description of MainForm.
    /// </summary>
    public partial class MainForm : Form //класс главной формы
    {
        
        public static ManualResetEvent connectDone = new ManualResetEvent(false); // ???
        public string qwert;  // не используется
        
        [STAThread] // ???
        public static void Main(string[] args) //  ???
        {
            Application.EnableVisualStyles(); // включает визуалньные стили формы;
            Application.SetCompatibleTextRenderingDefault(false); // ??
            Application.Run(new MainForm());  // запуск главной формы
        }
        
        public MainForm() // описание методов главной формы
        {
            //
            // The InitializeComponent() call is required for Windows Forms designer support.
            //
            InitializeComponent(); // инициализация компонентов главной формы
            
            //
            // TODO: Add constructor code after the InitializeComponent() call.
            //
        }
        
        void Button1Click(object sender, EventArgs e) // обработка метода кнопки
        {
            int BeginPort = Convert.ToInt32(nBeginPort.Value);  // создаем переменную BeginPort и заносим в нее значение порта, от
            int EndPort = Convert.ToInt32(nEndPort.Value); // создаем переменную EndPort и заносим в нее конечное значение, до
            
            int i; // дополнит.переменная для цикла
            
            progressBar1.Maximum = EndPort - BeginPort + 1; // установление максимума полоски заполнения

            progressBar1.Value = 0; // обнуление полоски
            listView1.Items.Clear(); // очищение поля вывода
            
            IPAddress addr = IPAddress.Parse(tIPAddress.Text); // заносим в перем. addr значение введенного IP-адреса
        
            for (i = BeginPort; i <= EndPort; i++)  // цикл
            {
                
                IPEndPoint ep = new IPEndPoint(addr, i);  // создаем перем. ep и заносим в нее IP-адрес и номер текущего порта
                //Создаем и инициализируем сокет, параметры - адресное пространство, тип сокета, тип протокола
                Socket soc = new Socket(AddressFamily.InterNetwork,
                                        SocketType.Stream,
                                        ProtocolType.Tcp);
                //Пытаемся соединиться с сервером
                IAsyncResult asyncResult = soc.BeginConnect(ep, new AsyncCallback(ConnectCallback), soc); 
                // как здесь работает asyncResult? Он получает сигнал - дошло до опрашиваемого порта или не дошло?
               
                if (!asyncResult.AsyncWaitHandle.WaitOne(30, false))
                    // условие - если сигнал от порта не пришел обратно в течении 30 секунд, то
             {
                    soc.Close(); // закрываем сокет и далее пишем, что порт закрыт
                 listView1.Items.Add("Порт " + i.ToString());
                    listView1.Items[i-BeginPort].SubItems.Add("");     
                    listView1.Items[i-BeginPort].SubItems.Add("закрыт");
                    listView1.Refresh();
                    progressBar1.Value += 1;
                    
             }
                else
                {
                    soc.Close(); // закрываем сокет и далее пишем, что порт открыт
                    listView1.Items.Add("Порт " + i.ToString());
                    listView1.Items[i-BeginPort].SubItems.Add("открыт");
                    progressBar1.Value += 1;
                }
            }
        }

        private static void ConnectCallback(IAsyncResult ar) // статистический метод с параметром ar, отображ-м инфу - дошел сигнал до порта или нет
        {
         try //  как работает try?
         {
             Socket client = (Socket) ar.AsyncState; // создаем сокет client и заносим в него инфу - дошел сигнал до порта или нет
             client.EndConnect(ar); // завершаем посылку сигнала на сокет client
             connectDone.Set();  // отсылаем сигнал от порта обратно на ???
         } 
            catch (Exception e) // обработка исключения
            {
         }
        }

    }
}

Автор: Zakonnic 10.6.2008, 16:55
 smile RTFM, однако. В вижуал студио ставим курсор на непонятный класс или метод и нажимаем F1 (если конечно справка установлена). В описании классов обычно есть пример использования и замечания по применению.

Вот из интернета, но то же самое есть и в локальном МСДН:
http://msdn.microsoft.com/en-us/library/system.threading.manualresetevent.manualresetevent(VS.71).aspx
http://msdn.microsoft.com/en-us/library/acy3edy3.aspx
http://msdn.microsoft.com/en-us/library/tad07yt6(VS.85).aspx

Да, и если все будет совсем плохо, то преподу тоже говори, что про тонкости можно почитаь в МСДН. Хотя с вопросом про метод Main это, конечно, не сработает smile

Автор: Joker07 12.6.2008, 18:19
Спасибо, уже сдал...  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)