Показывая различные информационные сети от сетевой карты


Я включил код со второго года проекта, который я хотел бы несколько советов. В основном он использует WMI для запроса сетевой карты от выбора (в зависимости от того, сколько их установлено в хост-машине) и показывает различные параметры, такие как информация ip, dhcp информации и т. д. Она также имеет функцию пинга.

Как я могу улучшить это, чтобы сделать его более профессионального применения? Я ищу вещи, как структура кода, функций (имея в виду Марк 2 будет иметь возможность взаимодействовать с исполнителем, чтобы отключить DHCP сервер и сменить адрес, к тому же я надеюсь, чтобы включить функции трассировки).

Сейчас этот проект уже закончен, так что я не изменяю, спрашивая это. Я просто хочу сделать шаг от создания тяжелый, но работающий кусок кода на полированной профессиональной.

Программа написана в Visual Studio 2010 с.

using System;
using System.Collections.Generic;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Management;
using System.Management.Instrumentation;
/////////////////////////////////////
using System.Net;
using System.Net.NetworkInformation;
using System.ComponentModel;
using System.Threading;

namespace WindowsFormsApplication3
{
    public partial class Form1 : Form
    {
        private int pingsSent;
        AutoResetEvent resetEvent = new AutoResetEvent(false);
        public Form1()
        {
            {
                InitializeComponent();
            }
            // win32 class
            //http://msdn.microsoft.com/en-us/library/aa394216(v=vs.85).aspx
            try
            {
                ManagementObjectSearcher query = new ManagementObjectSearcher(@"SELECT * FROM Win32_NetworkAdapter WHERE  Manufacturer != 'Microsoft' AND NOT PNPDeviceID LIKE 'ROOT\\%'");
                ManagementObjectCollection queryCollection = query.Get();
                foreach (ManagementObject mo in queryCollection)
                {
                    if (mo["MacAddress"] != null)
                    {
                        comboBox1.Items.Add(mo["Description"].ToString());
                    }
                }
            }
            catch (Exception ex)
            {
            }
        }
        string[] availabilityArray = new string[] { "", "Other", "Unknown", "Running or Full Power", "Warning", "In Test", "Not Applicable", "Power Off", "Off Line", "Off Duty", "Degraded", "Not Installed", "Install Error", "Power Save - Unknown" + "\n" + "The device is known to be in a power save state, but its exact status is unknown.", "Power Save - Low Power Mode" + "/n" + "The device is in a power save state, but still functioning, and may exhibit degraded performance.", "Power Save - Standby" + "/n" + "The device is not functioning, but could be brought to full power quickly.", "Power Cycle", "Power Save - Warning" + "/n" + "The device is in a warning state, though also in a power save state.", };
        string[] errorArray = new string[] { "Device is working properly.", "Device is not configured correctly.", "Windows cannot load the driver for this device.", "Driver for this device might be corrupted, or the system may be low on memory or other resources.", "Device is not working properly. One of its drivers or the registry might be corrupted.", "Driver for the device requires a resource that Windows cannot manage.", "Boot configuration for the device conflicts with other devices.", "Cannot filter.", "Driver loader for the device is missing.", "Device is not working properly. The controlling firmware is incorrectly reporting the resources for the device.", "Device cannot start.", "Device failed.", "Device cannot find enough free resources to use.", "Windows cannot verify the device's resources.", "Device cannot work properly until the computer is restarted.", "Device is not working properly due to a possible re-enumeration problem.", "Windows cannot identify all of the resources that the device uses.", "Device is requesting an unknown resource type.", "Device drivers must be reinstalled.", "Failure using the VxD loader.", "Registry might be corrupted.", "System failure. If changing the device driver is ineffective, see the hardware documentation. Windows is removing the device.", "Device is disabled.", "System failure. If changing the device driver is ineffective, see the hardware documentation.", "Device is not present, not working properly, or does not have all of its drivers installed.", "Windows is still setting up the device.", "Windows is still setting up the device.", "Device does not have valid log configuration.", "Device drivers are not installed", "Device is disabled. The device firmware did not provide the required resources.", "Device is using an IRQ resource that another device is using.", "Device is not working properly. Windows cannot load the required device drivers.", };
        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            ManagementObjectSearcher intquery = new ManagementObjectSearcher("SELECT * FROM Win32_NetworkAdapter WHERE Description ='" + comboBox1.Items[comboBox1.SelectedIndex].ToString() + "'");
            ManagementObjectCollection queryCollection = intquery.Get();
            foreach (ManagementObject mo in queryCollection)
            {
                string Dev = (mo["DeviceID"].ToString());
                txtMacAdd.Text = (" " + mo["MacAddress"].ToString());
                TxtAdapter.Text = (" " + mo["AdapterType"].ToString());
                txtAvailability.Text = (" " + mo["Availability"].ToString());
                txtCaption.Text = (" " + mo["Caption"].ToString());
                txtDeviceID.Text = (" " + mo["DeviceID"].ToString());
                txtErrorCode.Text = (mo["ConfigManagerErrorCode"].ToString());
                ManagementObjectSearcher intquery1 = new ManagementObjectSearcher("ASSOCIATORS OF {Win32_NetworkAdapter.DeviceID='" + Dev + "'}WHERE ResultClass=Win32_NetworkAdapterConfiguration");
                ManagementObjectCollection queryCollection1 = intquery1.Get();
                queryCollection1 = intquery1.Get();
                foreach (ManagementObject mo1 in queryCollection1)
                {
                    string[] addresses = (string[])mo1["IPAddress"];
                    string[] gateways = (string[])mo1["DefaultIPGateway"];
                    string[] Subnets = (string[])mo1["IPSubnet"];
                    foreach (string ipaddress in addresses)
                    {
                        listIp.Items.Add(ipaddress);
                    }
                    foreach (string gateway in gateways)
                    {
                        TxtGateway.Text = (gateway);
                    }
                    foreach (string subnet in Subnets)
                    {
                        listSubnet.Items.Add(subnet);
                    }
                    /////// SHOW DCHP CONFIG/////////
                    if ((bool)mo1["DHCPEnabled"] == true)
                    {
                        checkBox1.Checked = true;
                    }
                    if ((bool)mo1["DHCPEnabled"] != true)
                    {
                        checkBox1.Checked = !true;
                    }
                    DateTime dt = System.Management.ManagementDateTimeConverter.ToDateTime(mo1["DHCPLeaseExpires"].ToString());
                    txtDHCPExpires.Text = dt.ToString();
                    DateTime dte = System.Management.ManagementDateTimeConverter.ToDateTime(mo1["DHCPLeaseObtained"].ToString());
                    txtDHCPObtained.Text = dte.ToString();
                    txtDHCPServer.Text = (mo1["DHCPServer"].ToString());
                    //////////////////////Security////////////////////////////
                    if ((bool)mo1["IPFilterSecurityEnabled"] == true)
                    {
                        chkboxIPFilter.Checked = true;
                    }
                    if ((bool)mo1["IPFilterSecurityEnabled"] != true)
                    {
                        chkboxIPFilter.Checked = !true;
                    }
                    string[] IPSecProtocols = (string[])mo1["IPSecPermitIPProtocols"];
                    string[] IPSecPermitTCPPorts = (string[])mo1["IPSecPermitTCPPorts"];
                    string[] IPSecPermitUDPPorts = (string[])mo1["IPSecPermitUDPPorts"];
                    foreach (string IPSecProtocol in IPSecProtocols)
                    {
                        //richTextBox1.AppendText(IPSecProtocol);
                        listPermitIP.Items.Add(IPSecProtocol);
                    }
                    foreach (string TCPPort in IPSecPermitTCPPorts)
                    {
                        listPermitTCP.Items.Add(TCPPort);
                    }
                    foreach (string UDPPort in IPSecPermitUDPPorts)
                    {
                        listPermitUDP.Items.Add(UDPPort);
                    }
                    ///////////////////DNS/////////////////////////////
                    try
                    {
                        txtDNSDomain.Text = (mo1["DNSDomain"].ToString());
                        txtDNShostName.Text = (mo1["DNSHostName"].ToString());
                        string[] DNSDomainSuffSearch = (string[])mo1["DNSDomainSuffixSearchOrder"];
                        string[] DNSServerSearchOrder = (string[])mo1["DNSServerSearchOrder"];
                        foreach (string domainSuff in DNSDomainSuffSearch)
                        {
                            listDomainSuffSearchOrder.Items.Add(domainSuff);
                        }
                        foreach (string DNSServer in DNSServerSearchOrder)
                        {
                            listDNSServerSearchOrder.Items.Add(DNSServer);
                        }
                        if ((bool)mo1["DNSEnabledForWINSResolution"] == true)
                        {
                            chkDNSWinsResolution.Checked = true;
                        }
                        if ((bool)mo1["DNSEnabledForWINSResolution"] != true)
                        {
                            chkDNSWinsResolution.Checked = !true;
                        }
                        if ((bool)mo1["DomainDNSRegistrationEnabled"] == true)
                        {
                            chkDNSRegEnabled.Checked = true;
                        }
                        if ((bool)mo1["DomainDNSRegistrationEnabled"] != true)
                        {
                            chkDNSRegEnabled.Checked = !true;
                        }
                    }
                    catch (Exception ex3)
                    { }
                }
            }
        }
        private void button2_Click(object sender, EventArgs e)
        {
            try
            {
                ManagementObjectSearcher intquery;
                intquery = new ManagementObjectSearcher("SELECT * FROM Win32_NetworkAdapter WHERE Description ='" + comboBox1.Items[comboBox1.SelectedIndex].ToString() + "'");
                ManagementObjectCollection queryCollection = intquery.Get();
                queryCollection = intquery.Get();
                foreach (ManagementObject mo in queryCollection)
                {
                    string thisstring = (mo["ConfigManagerErrorCode"].ToString());
                    int error;
                    int.TryParse(thisstring, out error);
                    MessageBox.Show(errorArray[error]);
                }
            }
            catch (Exception ex1)
            {
                MessageBox.Show("Please Select a Device");
            }
        }
        private void BtnAvailability_Click(object sender, EventArgs e)
        {
            try
            {
                ManagementObjectSearcher intquery;
                intquery = new ManagementObjectSearcher("SELECT * FROM Win32_NetworkAdapter WHERE Description ='" + comboBox1.Items[comboBox1.SelectedIndex].ToString() + "'");
                ManagementObjectCollection queryCollection = intquery.Get();
                queryCollection = intquery.Get();
                foreach (ManagementObject mo in queryCollection)
                {
                    string thisstring = (mo["Availability"].ToString());
                    int Avail;
                    int.TryParse(thisstring, out Avail);
                    MessageBox.Show(availabilityArray[Avail]);
                }
            }
            catch (Exception ex2)
            {
                MessageBox.Show("Please Select a Device");
            }
        }
        private void btnPing_Click(object sender, EventArgs e)
        {
            // Reset the number of pings
            pingsSent = 0;
            // Clear the textbox of any previous content
            txtResponse.Clear();
            txtResponse.Text += "Pinging " + txtIP.Text + " with 32 bytes of data:\r\n\r\n";
            // Send the ping
            SendPing();
        }
        private void SendPing()
        {
            System.Net.NetworkInformation.Ping pingSender = new System.Net.NetworkInformation.Ping();
            // Create an event handler for ping complete
            pingSender.PingCompleted += new PingCompletedEventHandler(pingSender_Complete);
            // Create a buffer of 32 bytes of data to be transmitted.
            byte[] packetData = Encoding.ASCII.GetBytes("................................");
            // Jump though 50 routing nodes tops, and don't fragment the packet
            PingOptions packetOptions = new PingOptions(50, true);
            // Send the ping asynchronously
            pingSender.SendAsync(txtIP.Text, 5000, packetData, packetOptions, resetEvent);
        }
        private void pingSender_Complete(object sender, PingCompletedEventArgs e)
        {
           // If the operation was canceled, display a message to the user.
            if (e.Cancelled)
            {
                txtResponse.Text += "Ping was canceled...\r\n";
                // The main thread can resume
                ((AutoResetEvent)e.UserState).Set();
            }
            else if (e.Error != null)
            {
                txtResponse.Text += "An error occured: " + e.Error + "\r\n";
                // The main thread can resume
                ((AutoResetEvent)e.UserState).Set();
            }
            else
            {
               PingReply pingResponse = e.Reply;
                // Call the method that displays the ping results, and pass the information with it
               ShowPingResults(pingResponse);
            }
        }
        public void ShowPingResults(PingReply pingResponse)
        {
            if (pingResponse == null)
            {
                // We got no response
                txtResponse.Text += "There was no response.\r\n\r\n";
                return;
            }
            else if (pingResponse.Status == IPStatus.Success)
            {
                // We got a response, let's see the statistics
                txtResponse.Text += "Reply from " + pingResponse.Address.ToString() + ": bytes=" + pingResponse.Buffer.Length + " time=" + pingResponse.RoundtripTime + " TTL=" + pingResponse.Options.Ttl + "\r\n";
            }
            else
            {
                // The packet didn't get back as expected, explain why
                txtResponse.Text += "Ping was unsuccessful: " + pingResponse.Status + "\r\n\r\n";
            }
            // Increase the counter so that we can keep track of the pings sent
            string strpings = txtNumPackets.Text;
            int numbpings = int.Parse(strpings);
            if (txtNumPackets.Text == null)
            {
                numbpings = 4;
            }
            pingsSent++;
            // Send 4 pings
            if (pingsSent < numbpings)
            {
                SendPing();
            }
        }
        private void panel2_Paint(object sender, PaintEventArgs e)
        {
        }
        //////////////////////////////////////////////////////////////////////////////////////////
    }
}


2440
14
задан 7 июня 2011 в 09:06 Источник Поделиться
Комментарии
5 ответов

Одна или редко две пустые строки могут помочь удобочитаемости, больше ухудшает читабельность.

Если код длинный и идет с экрана, можно положить новую линию, чтобы сделать его читабельным без прокрутки.

Почему бессмысленно ///////////////////////////////////// распорку?

Код имеет очень мало комментариев, особенно возле старта, и они не добавляют много читаемость, если вы хотите разделить код на области применения области и конца края ключевые слова.

Пространства имен пространства имен WindowsFormsApplication3 и классы общественных частичная класс form1 : формаи контролирует все автоматически созданные имена. Это должно быть изменено на что-то, что действительно придает некоторое представление о своей цели.

Поймать родовые исключения редко, только сделать это, если вы действительно хотите, чтобы обработать все исключения, то же и комментировать эту соответственно, просто поймать на свои работы для этого.

Если вы собираетесь погасить за исключением, вы должны комментировать, соответственно, вам не нужно указать имя исключения при этом, просто поймать (SomeException).

Рассмотреть вопрос об объявлении константы как константы или ресурсов, это не всегда целесообразно, особенно когда строка эффективного кода и самостоятельной описательный, но это вообще хорошая практика.

!правда - это ложь.

Использовать имена верблюд декларации, в случае Паскаль для констант. Имена переменных должны состоять из целых слов или признанных сокращений или аббревиатур. Аббревиатуры из 3 или более символов должно быть написано в нижнем регистре.

Используйте Строку.Формат с объекта iformatprovider при строительстве или конкатенации строк, а не + оператор.

Нет пустых обработчиков событий.

Рекомендуется использовать FXCop или для ReSharper.

12
ответ дан 7 июня 2011 в 09:06 Источник Поделиться

Пару вещей на основе быстрого чтения через код:

Во-первых, ловить исключения, которые вы не знаете, как обрабатывать, как правило, не хорошая идея. И давя исключения-это почти всегда плохая идея. Например, у вас есть:

try
{
// do stuff here
}
catch (Exception)
{
// do nothing
}

Вы должны ловить только те исключения, которые вы знаете, как обращаться. Есть много неожиданных вещей, которые могут произойти в вашем коде, что может поместить программу в нестабильном состоянии. Если это произойдет, вы должны позволить аварийному завершению программы. Ловя и давя все исключения, вы разрешите программе потенциально повредить данные или возвращать неверные результаты.

У вас есть этот код в один из ваших методов:

if ((bool)mo1["DNSEnabledForWINSResolution"] == true)
{
chkDNSWinsResolution.Checked = true;
}
if ((bool)mo1["DNSEnabledForWINSResolution"] != true)
{
chkDNSWinsResolution.Checked = !true;
}

Вы можете сократить этот срок и сделать его более читабельным, используя если...еще:

if ((bool)mo1["DNSEnabledForWINSResolution"] == true)
{
chkDNSWinsResolution.Checked = true;
}
else
{
chkDNSWinsResolution.Checked = !true;
}

Кроме того, !правда - это то же самое, что ложь в C#. типа bool - это тип, который может принимать только одно из двух значений, в отличие от старого С типа bool , что это просто псевдоним для инт. C# программистов привыкли видеть ложное. !правда будут путать их.

Код может быть упрощен до:

chkDNSWinsResolution.Checked = (bool)mo1["DNSEnabledForWINSResolution"];

без потери четкости. На самом деле, можно утверждать, что это более ясно. Лаконичность-это не самоцель, но здесь смысл вполне ясен, и он устраняет несколько строк лишних строк кода.

Ваш availabilityArray и errorArray массивов должен быть определен как статический только для чтения, и отформатирован на несколько строк. Например:

static readonly string[] availabilityArray = new string[]
{
"",
"Other",
"Unknown",
// etc.
}

Это гораздо более читабельным. Делая их только для чтения предотвращает их изменение, а также рассказывает другим, глядя на программу, что они не будут изменены. статические гарантирует, что только один экземпляр будет использоваться. Если он не статический, то каждый экземпляр класса будет создан отдельный массив, чтобы держать такое же постоянное строк.

Вам нужно обрабатывать возвращаемые значения ошибка. Например, у вас есть:

int error;
int.TryParse(thisstring, out error);

Если thisstring не является допустимым целым числом, то ошибка будет 0. Вы, наверное, должны писать что-то вроде:

int error;
string errMsg;
if (int.TryParse(thisstring, out error) && error >= 0 && error < errorArray.Length)
{
errMsg = errorArray[error];
}
else
{
errMsg = string.Format("Unknown error code: {0}", thisstring);
}
MessageBox.Show(errMsg);

В противном случае ваш код будет бросать исключение, если ошибка находится вне диапазона возможных коды ошибок, и если thisstring не является допустимым числом, вы будете отображать поддельные сообщения об ошибке.

В общем, если преобразование может вызвать ошибку, предположим, что это в какой-то момент, и быть готовым, чтобы справиться с этим. В одном месте, например, вы используете инт.Разобрать для анализа пользовательского ввода из текстового поля. Если пользователь вводит нечисловые значения или значения, которые не могут быть преобразованы в целое число (например, 3000000000), который будет бросать исключение. Вы должны использовать метод tryparse, проверить возвращаемое значение, и отобразить сообщение об ошибке в случае неудачи.

10
ответ дан 7 июня 2011 в 09:06 Источник Поделиться

Рефакторинг вашего comboBox1_SelectedIndexChanged способ, чтобы просто называть разные функции для разных задач это делать. Передающий правильные аргументы функции по мере необходимости.

Нет пустых предложений catch в коде. Показывает плохой обработки исключений. Если вы поместите код в попытке поймать , вы должны по крайней мере убедиться, что вы справляетесь с исключениями правильно.

Название правильно элементов управления. Управление с имена как элемент combobox1 не правильное именование. Что не скажи, глядя на ваш код, что это комбобокс-это все. Правильное именование делает много
разница в читабельности кода.

Это:

catch (Exception ex1)
{
MessageBox.Show("Please Select a Device");
}

не вписывается в это положение поймать, код, который находится внутри сопутствующий блок try не всегда удастся из-за отсутствия выбранного устройства. Вы должны справиться с этим с помощью оператора if, как на самом деле это не исключение, просто поток в вашей программе, информирующее пользователя, что должно быть сделано. Это вовсе не означает, что исключительные обстоятельства в вашей программе.

9
ответ дан 7 июня 2011 в 09:06 Источник Поделиться

Некоторые мысли:


  1. Комментарии было бы неплохо. Я вижу мало, очень скудно написано, и это делает его трудно, чтобы выяснить, что происходит от быстрого взгляда. Кроме того, в вашем комментарии, добавлять что-то вроде этого:

    /*
    * NIC-WMI Query
    * Version 1.0, Created on 1/2/10 by Dylan Jackson
    *
    * Description of program...
    *
    * Audit Trail:
    * ------------
    *
    * 01/01/2010 DJ v0.9 Added a,b,c. Fixed d,e.
    * ...
    */

    Блок комментариев, как это позволяет мне знать, что программа, какая версия, кто это написал (и когда), какие изменения были внесены (и кем). Вы сможете придумать свой собственный стиль и то, что вы делаете, и не хочу есть (или может быть под диктовку), но что-то вверху-это не плохая вещь, чтобы помочь другим читателям знать, что происходит.


  2. Не используйте родовой объект/имена классов. Такие вещи, как WindowsFormApplication3 или элемент button2 - это плохо, так как я не могу сказать, что они делают, особенно, когда вы пишете код события для них. button2_click следующий говорит мне молнию.

  3. Пробел может быть плохим (как и в слишком много Между строк), но пробелы в длинные списки-это всегда хорошо. В идеале не выходя за 132 символов, и даже тогда, если у вас есть длинный список разойтись красиво, так легко читается. Например:

    string[] errorArray = new string[] 
    {
    "Device is working properly.",
    "Device is not configured correctly.",
    "Windows cannot load the driver for this device.",
    "Driver for this device might be corrupted, or the system may be low on memory or other resources.",
    "Device is not working properly. One of its drivers or the registry might be corrupted.",
    };

  4. Я знаю, что вы не можете поставить внешний вид форма в коде, но эй, это было бы неплохо иметь представление о том, что форма выглядит и какие объекты какие. Что-то вроде этого не будет неугодных (как пример):


    frmWhatIsYourName выглядит так:

    +---------------------------------------------------+
    | What is your name? |
    |---------------------------------------------------|
    | |
    | Please enter your name: [txtName ] |
    | |
    | [ Ok ] [ Cancel ] |
    | (btnOk) (btnCancel)|
    +---------------------------------------------------+

    Вы не должны получить особенно необычные; словесное описание будет работать также:

    /*
    * The form frmWhatIsYourName has a single text box named txtName for storing
    * the person's name, and two buttons, btnOk (OK) and btnCancel (CANCEL).
    */

Что бы сделать хороший старт, я думаю, и есть хорошие предложения от всех остальных здесь.

6
ответ дан 9 июня 2011 в 04:06 Источник Поделиться

@Тони Тигра ответ является идеальным, поэтому я только хочу попросить тебя об одолжении.

Пожалуйста, замените

if ((bool)mo1["DNSEnabledForWINSResolution"] != true)
{
chkDNSWinsResolution.Checked = !true;
}

блоки с чем-то более читабельным, как

chkDNSWinsResolution.Checked = (bool)mo1["DNSEnabledForWINSResolution"];

Кроме того, !правда называется ложь.

5
ответ дан 7 июня 2011 в 09:06 Источник Поделиться