Advertisement
inf926k

Untitled

Dec 16th, 2016
392
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 20.73 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Threading;
  9. using System.Threading.Tasks;
  10. using System.Windows.Forms;
  11. using System.Net.NetworkInformation;
  12. using System.Net;
  13. using System.Diagnostics;
  14.  
  15. namespace avs_l1
  16. {
  17.     public partial class MainForm : Form
  18.     {
  19.         List<IPAddressInfo> addressInfoAssemblyList = new List<IPAddressInfo>();
  20.         Stopwatch ipAnalysisStopwatch = new Stopwatch();
  21.  
  22.         public int IPsCount { get; private set; }
  23.         //public double IPsReceivedCount { get; private set; }
  24.         private int receivedTotal = 0;
  25.         private Object receivedTotalObj = new Object();
  26.         public MainForm()
  27.         {
  28.             InitializeComponent();
  29.             int workerThreads, completionPortThreads;
  30.             ThreadPool.GetAvailableThreads(out workerThreads, out completionPortThreads);
  31.             try
  32.             {
  33.                 //ThreadPool.SetMinThreads(500, 100);
  34.                 ThreadPool.SetMinThreads(200, 100);
  35.                 ThreadPool.QueueUserWorkItem(delegate { }, new object[] { }); // Create threads
  36.             }
  37.             catch { /* Ignore */ }
  38.             dataGridView.Columns[0].SortMode = DataGridViewColumnSortMode.Programmatic;
  39.             //IPAddress ip1 = IPAddress.Parse("1.1.1.1");
  40.             //IPAddress ip2 = IPAddress.Parse("1.1.2.1");
  41.  
  42.             //List<IPAddress> adrss = new List<IPAddress>();
  43.             //for (long i = ip1.Address; i < ip2.Address; ++i)
  44.             //    adrss.Add(new IPAddress(i));
  45.             //;
  46.         }
  47.  
  48.         private void buttonExit_Click(object sender, EventArgs e)
  49.         {
  50.             Cursor = Cursors.Default;
  51.             Environment.Exit(0);
  52.         }
  53.  
  54.         private void buttonStart_Click(object sender, EventArgs e)
  55.         {
  56.             addressInfoAssemblyList.Clear();
  57.             ipAnalysisStopwatch.Reset();
  58.             ipAnalysisStopwatch.Start();
  59.  
  60.             Cursor = Cursors.WaitCursor;
  61.             dataGridView.Rows.Clear();
  62.             //IPsReceivedCount = 0;
  63.             receivedTotal = 0;
  64.             progressBar.Value = 0;
  65.             start.Enabled = false;
  66.             LinkedList<IPAddress> addresses, addressesTemp;
  67.            
  68.             try
  69.             {
  70.                 addresses = GenerateIpRange();
  71.                 addressesTemp = GenerateIpRange();
  72.             }
  73.             catch
  74.             {
  75.                 MessageBox.Show("Ошибка при генерации диапазона.", "Ошибка");
  76.                 start.Enabled = true;
  77.                 Cursor = Cursors.Default;
  78.                 return;
  79.             }
  80.  
  81.             for (int i = 0; i < addresses.Count; ++i)
  82.             {
  83.                 dataGridView.Rows.Insert(i,
  84.                         new object[]
  85.                         {
  86.                             addresses.ElementAt(i),
  87.                             "", ""
  88.                         }
  89.                     );
  90.             }
  91.  
  92.             IPsCount = addresses.Count;
  93.             int exceptionsCount = 0;
  94.             foreach (IPAddress address in addressesTemp)
  95.             {
  96.                 Ping p = new Ping();
  97.                 p.PingCompleted += AnalyzePingAndUpdateTable;
  98.                 try
  99.                 {
  100.                     p.SendAsync(address, address);
  101.                     ThreadPool.QueueUserWorkItem(AnalyzeDnsNameAndUpdateTable
  102.                         , new object[] { address });
  103.                 }
  104.                 catch {
  105.                     AddRow(
  106.                             new IPAddressInfo(
  107.                                     address.ToString(),
  108.                                     "-",
  109.                                     "-"
  110.                                 )  
  111.                         );
  112.                     if ((++exceptionsCount) == IPsCount)
  113.                     {
  114.                         MessageBox.Show("Диапазон состоит из зарезервированных IP-адресов");
  115.                         progressBar.Value = progressBar.Maximum;
  116.                         receivedTotal = 0;
  117.                         start.Enabled = true;
  118.                         Cursor = Cursors.Default;
  119.                     }
  120.                    
  121.                 };
  122.             }
  123.         }
  124.  
  125.         private void AnalyzePingAndUpdateTable(object sender, PingCompletedEventArgs e)
  126.         {
  127.             //lock (receivedTotalObj)
  128.             //{
  129.             //}
  130.  
  131.             IPAddress ipAddress = e.UserState as IPAddress;
  132.             String replyStatus = e.Reply.Status.ToString();
  133.             //lock (addressInfoAssemblyList)
  134.             //{
  135.             for (int i = 0; i < addressInfoAssemblyList.Count; ++i)
  136.             {
  137.                 // If some address info already exists (info from dns analysis)
  138.                 if (addressInfoAssemblyList[i].Address.Equals(ipAddress))
  139.                 {
  140.                     addressInfoAssemblyList[i].Status = replyStatus;
  141.                     receivedTotal++;
  142.                     AddRow(addressInfoAssemblyList[i]);
  143.                     return;
  144.                 }
  145.             }
  146.             //}
  147.             // Else, if there is no any info about ip address,
  148.             // add an instance of IPAddressInfo object with ping reply status
  149.             IPAddressInfo info = new IPAddressInfo();
  150.             info.Address = ipAddress;
  151.             info.Status = replyStatus;
  152.             addressInfoAssemblyList.Add(info);
  153.  
  154.  
  155.         }
  156.  
  157.         private void AnalyzeDnsNameAndUpdateTable(object ipObj)
  158.         {
  159.             //lock(receivedTotalObj)
  160.             //{
  161.             //}
  162.  
  163.             IPAddress ipAddress = (IPAddress)((object[])ipObj)[0];
  164.             String dnsName = "";
  165.             IPHostEntry entry = null;
  166.             try
  167.             {
  168.  
  169.                 entry = Dns.GetHostEntry(ipAddress.ToString());
  170.             }
  171.             catch
  172.             {
  173.                 dnsName = "Неизвестно";
  174.             }
  175.             if (entry != null)
  176.                 dnsName = entry.HostName;
  177.             lock (addressInfoAssemblyList)
  178.             {
  179.                 for (int i = 0; i < addressInfoAssemblyList.Count; ++i)
  180.                 {
  181.                     // If some address info already exists (info from ping)
  182.                     if (addressInfoAssemblyList[i].Address.Equals(ipAddress))
  183.                     {
  184.                         addressInfoAssemblyList[i].Name = dnsName;
  185.                         receivedTotal++;
  186.                         AddRow(addressInfoAssemblyList[i]);
  187.                         return;
  188.                     }
  189.                 }
  190.             }
  191.             // Else, if there is no any info about ip address,
  192.             // add an instance of IPAddressInfo object with DNS name
  193.             IPAddressInfo info = new IPAddressInfo();
  194.             info.Address = ipAddress;
  195.             info.Name = dnsName;
  196.             addressInfoAssemblyList.Add(info);
  197.         }
  198.  
  199.  
  200.         delegate void AddRowCallback(IPAddressInfo info);
  201.         private void AddRow(IPAddressInfo info)
  202.         {
  203.             if (this.dataGridView.InvokeRequired)
  204.             {
  205.                 AddRowCallback arc = new AddRowCallback(AddRow);
  206.                 this.Invoke(arc, new object[] { info });
  207.             }
  208.             else
  209.             {
  210.                 label11.Text = receivedTotal.ToString();
  211.  
  212.                 string ipstr = info.Address.ToString();
  213.                 var rows = dataGridView.Rows;
  214.                 for (int i = 0; i < rows.Count; ++i)
  215.                 {
  216.                     if (rows[i].Cells[0].Value.ToString().Equals(ipstr))
  217.                     {
  218.                         rows[i].SetValues(
  219.                             ipstr,
  220.                             info.Status,
  221.                             info.Name
  222.                             );
  223.                     }
  224.                 }
  225.  
  226.                 // Update progress bar
  227.  
  228.                 //SortGridAcending();
  229.                 progressBar.Value = (int)(((double)receivedTotal /*/ 2d */ / IPsCount) * 100d);
  230.                 if (receivedTotal >= IPsCount)
  231.                 {
  232.                     progressBar.Value = progressBar.Maximum;
  233.                     receivedTotal = 0;
  234.                     MessageBox.Show("Проверено " + IPsCount + " IP - адресов"
  235.                     + "\nЗа " + ipAnalysisStopwatch.Elapsed.ToString(), "Результат");
  236.                     progressBar.Value = progressBar.Maximum;
  237.                     start.Enabled = true;
  238.                     Cursor = Cursors.Default;
  239.                 }
  240.  
  241.                 // Sort list
  242.                 //dataGridView.Sort(dataGridView.Columns[0], ListSortDirection.Ascending);
  243.             }
  244.         }
  245.  
  246.         private LinkedList<IPAddress> GenerateIpRange()
  247.         {
  248.             short from1, from2, from3, from4,
  249.                 to1, to2, to3, to4;
  250.             from1 = Convert.ToInt16(this.from1.Text);
  251.             from2 = Convert.ToInt16(this.from2.Text);
  252.             from3 = Convert.ToInt16(this.from3.Text);
  253.             from4 = Convert.ToInt16(this.from4.Text);
  254.  
  255.             to1 = Convert.ToInt16(this.to1.Text);
  256.             to2 = Convert.ToInt16(this.to2.Text);
  257.             to3 = Convert.ToInt16(this.to3.Text);
  258.             to4 = Convert.ToInt16(this.to4.Text);
  259.  
  260.             if (from1 > to1)
  261.                 throw new Exception();
  262.             else if (from2 > to2 && from1 == to1)
  263.                 throw new Exception();
  264.             else if (from3 > to3 && from2 == to2)
  265.                 throw new Exception();
  266.             else if (from4 > to4 && from3 == to3)
  267.                 throw new Exception();
  268.  
  269.  
  270.             LinkedList<IPAddress> addresses = new LinkedList<IPAddress>();
  271.             short cur1 = from1;
  272.             short cur2 = from2;
  273.             short cur3 = from3;
  274.             short cur4 = from4;
  275.             while (
  276.                 cur1 != to1 ||
  277.                 cur2 != to2 ||
  278.                 cur3 != to3 ||
  279.                 cur4 != to4
  280.                 )
  281.             {
  282.                 IPAddress ip =
  283.                         new IPAddress(new byte[] {
  284.                             (byte) cur1,
  285.                             (byte) cur2,
  286.                             (byte) cur3,
  287.                             (byte) cur4
  288.                         });
  289.  
  290.                 addresses.AddLast(ip);
  291.                 cur4++;
  292.                 if (cur4 == 256)
  293.                 {
  294.                     cur4 = 0;
  295.                     cur3++;
  296.                 }
  297.                 if (cur3 == 256)
  298.                 {
  299.                     cur4 = cur3 = 0;
  300.                     cur2++;
  301.                 }
  302.                 if (cur2 == 256)
  303.                 {
  304.                     cur2 = cur3 = cur4 = 0;
  305.                     cur1++;
  306.                 }
  307.  
  308.             }
  309.  
  310.             addresses.AddLast(new IPAddress(new byte[] {
  311.                 (byte) cur1,
  312.                 (byte) cur2,
  313.                 (byte) cur3,
  314.                 (byte) cur4
  315.             }));
  316.  
  317.             return addresses;
  318.         }
  319.  
  320.         private void dataGridView_MouseUp(object sender, MouseEventArgs e)
  321.         {
  322.             LinkedList<IPAddress> ips = new LinkedList<IPAddress>();
  323.             foreach (var row in dataGridView.SelectedRows)
  324.             {
  325.                 String ipAsString = ((DataGridViewRow)row).Cells[0].Value.ToString();
  326.                 ips.AddLast(IPAddress.Parse(ipAsString));
  327.             }
  328.             if (ips.Count >= 3)
  329.                 AnalyzeIPRange(ips);
  330.         }
  331.  
  332.         private void AnalyzeIPRange(LinkedList<IPAddress> ips)
  333.         {
  334.             IPAddress mask = IPAddressInfo.GetMask(ips);
  335.             IPAddress networkAddress = IPAddressInfo.GetNetworkAddress(ips);
  336.             IPAddress broadcastAddress = IPAddressInfo.GetBroadcastAddress(ips);
  337.             IPAddress gatewayAddress = IPAddressInfo.GetGatewayAddress(ips);
  338.  
  339.             this.mask.Text = mask.ToString();
  340.             this.network.Text = networkAddress.ToString();
  341.             this.broadcast.Text = broadcastAddress.ToString();
  342.             this.gateway.Text = gatewayAddress.ToString();
  343.  
  344.             this.mask.Invalidate();
  345.             this.mask.Invalidate();
  346.             this.broadcast.Invalidate();
  347.             ;
  348.         }
  349.  
  350.         private void SortGridAcending()
  351.         {
  352.             IPAddressComparer comparer = new IPAddressComparer();
  353.             dataGridView.Sort(comparer);
  354.             return;
  355.             IPAddress[] adrss = new IPAddress[dataGridView.Rows.Count];
  356.             for (int i = 0; i < dataGridView.Rows.Count; ++i)
  357.             {
  358.                 adrss[i] = IPAddress.Parse(
  359.                         dataGridView.Rows[i].Cells[0].Value.ToString()
  360.                     );
  361.             }
  362.             var rows = dataGridView.Rows;
  363.             for (int i = rows.Count - 1; i > 0; --i)
  364.             {
  365.                 for (int j = 1; j < i; ++j)
  366.                 {
  367.  
  368.                     IPAddress ip1 = adrss[j];
  369.                     IPAddress ip2 = adrss[j - 1];
  370.  
  371.                     //if (!compareIPAddresses(ip1, ip2))
  372.                     //{
  373.                     //    // Swap i and j
  374.  
  375.                     //    var ir = rows[i];
  376.                     //    var jr = rows[j];
  377.                     //    rows.Remove(ir);
  378.                     //    rows.Remove(jr);
  379.                     //    rows.Insert(j, ir);
  380.                     //    rows.Insert(i, jr);
  381.  
  382.                     //    //var temp = rows[i];
  383.                     //    //rows[i] = rows[j];
  384.  
  385.                     //}
  386.                 }
  387.             }
  388.             dataGridView.InvalidateColumn(0);
  389.             ;
  390.  
  391.         }
  392.  
  393.         private void dataGridView_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
  394.         {
  395.             if (e.ColumnIndex == 0)
  396.                 SortGridAcending();
  397.         }
  398.         public class IPAddressComparer : System.Collections.IComparer
  399.         {
  400.             public int Compare(object x, object y)
  401.             {
  402.                 var r1 = x as DataGridViewRow;
  403.                 var r2 = y as DataGridViewRow;
  404.  
  405.                 return CompareIPAddresses(
  406.                         IPAddress.Parse(r1.Cells[0].Value.ToString()),
  407.                         IPAddress.Parse(r2.Cells[0].Value.ToString())
  408.                     );
  409.                 //return compareIPAddresses(x as IPAddress, y as IPAddress);
  410.             }
  411.             public static int CompareIPAddresses(IPAddress ip1, IPAddress ip2)
  412.             {
  413.                 String[] strBytes1 = ip1.ToString().Split('.');
  414.                 String[] strBytes2 = ip2.ToString().Split('.');
  415.                 byte[] bytes1 = new byte[4];
  416.                 byte[] bytes2 = new byte[4];
  417.                 for (int i = 0; i < 4; ++i)
  418.                 {
  419.                     bytes1[i] = Convert.ToByte(strBytes1[i]);
  420.                     bytes2[i] = Convert.ToByte(strBytes2[i]);
  421.                 }
  422.                 bool res = false;
  423.                 if (bytes1[3] > bytes2[3])
  424.                     res = true;
  425.                 if (bytes1[3] < bytes2[3])
  426.                     res = false;
  427.  
  428.                 if (bytes1[2] > bytes2[2])
  429.                     res = true;
  430.                 if (bytes1[2] < bytes2[2])
  431.                     res = false;
  432.  
  433.                 if (bytes1[1] > bytes2[1])
  434.                     res = true;
  435.                 if (bytes1[1] < bytes2[1])
  436.                     res = false;
  437.  
  438.                 if (bytes1[0] > bytes2[0])
  439.                     res = true;
  440.                 if (bytes1[0] < bytes2[0])
  441.                     res = false;
  442.                 if (res) return 1;
  443.                 else return -1;
  444.             }
  445.         }
  446.     }
  447.  
  448.     class IPAddressInfo
  449.     {
  450.         public IPAddress Address = null;
  451.         public string Name = null;
  452.         public String Status = null;
  453.  
  454.         public IPAddressInfo(IPAddress address)
  455.         {
  456.             this.Address = address;
  457.         }
  458.         public IPAddressInfo() { }
  459.  
  460.         public IPAddressInfo(string address, string name, string status)
  461.         {
  462.             Address = IPAddress.Parse(address);
  463.             Name = name;
  464.             Status = status;
  465.         }
  466.  
  467.         public override string ToString()
  468.         {
  469.             return Address.ToString() + " " + Status + " " + Name;
  470.         }
  471.         public static IPAddress GetNetworkAddress(LinkedList<IPAddress> ipRange)
  472.         {
  473.             return new IPAddress(ipRange.First().Address & GetMask(ipRange).Address);
  474.         }
  475.         public static IPAddress GetGatewayAddress(LinkedList<IPAddress> ipRange)
  476.         {
  477.             try
  478.             {
  479.                 return new IPAddress(GetNetworkAddress(ipRange).Address + (1 << 24));
  480.             }
  481.             catch (Exception e)
  482.             {
  483.                 MessageBox.Show("БАГ" + ipRange.ToString() + "\n" + e.ToString(), "public static IPAddress GetGatewayAddress(LinkedList<IPAddress> ipRange)");
  484.                 return new IPAddress(0);
  485.             }
  486.         }
  487.         public static IPAddress GetBroadcastAddress(LinkedList<IPAddress> ipRange)
  488.         {
  489.             String smask = IPAddressToBinaryString(GetMask(ipRange));
  490.  
  491.             //smask = Reverse(smask);
  492.  
  493.             String notSMask = "";
  494.             for (int i = 0; i < smask.Length; ++i)
  495.             {
  496.                 if (smask[i].Equals('1'))
  497.                     notSMask = '0' + notSMask;
  498.                 else
  499.                     notSMask = '1' + notSMask;
  500.             }
  501.  
  502.             long res = Convert.ToInt64(notSMask, 2);
  503.             var t = new IPAddress(res);
  504.             var resIP = new IPAddress(res | ipRange.First().Address);
  505.             return resIP;
  506.         }
  507.         public static IPAddress GetMask(LinkedList<IPAddress> ipRange)
  508.         {
  509.             var first = ipRange.First();
  510.             var last = ipRange.Last();
  511.             // Find max and min IP in range
  512.             foreach (IPAddress current in ipRange)
  513.             {
  514.                 if (String.Compare
  515.                     (
  516.                         IPAddressToBinaryString(first),
  517.                         IPAddressToBinaryString(current)
  518.                     ) == 1)
  519.                     first = current;
  520.                 if (String.Compare
  521.                     (
  522.                         IPAddressToBinaryString(last),
  523.                         IPAddressToBinaryString(current)
  524.                     ) == -1)
  525.                     last = current;
  526.  
  527.                 //if (first.GetAddressBytes()[0] > current.GetAddressBytes()[0])
  528.                 //    first = current;
  529.                 //else if (first.GetAddressBytes()[1] > current.GetAddressBytes()[1])
  530.                 //    first = current;
  531.                 //else if (first.GetAddressBytes()[2] > current.GetAddressBytes()[2])
  532.                 //    first = current;
  533.                 //else if (first.GetAddressBytes()[3] > current.GetAddressBytes()[3])
  534.                 //    first = current;
  535.  
  536.                 //if (last.GetAddressBytes()[0] < current.GetAddressBytes()[0])
  537.                 //    last = current;
  538.                 //else if (last.GetAddressBytes()[1] < current.GetAddressBytes()[1])
  539.                 //    last = current;
  540.                 //else if (last.GetAddressBytes()[2] < current.GetAddressBytes()[2])
  541.                 //    last = current;
  542.                 //else if (last.GetAddressBytes()[3] < current.GetAddressBytes()[3])
  543.                 //    last = current;
  544.             }
  545.  
  546.             String mask = "";
  547.             var ip1 = IPAddressToBinaryString(first);
  548.             var ip2 = IPAddressToBinaryString(last);
  549.             bool isMatchUp = true;
  550.  
  551.             for (int i = 0; i < ip1.Length; ++i)
  552.             {
  553.                 if (isMatchUp)
  554.                     isMatchUp = ip1[i].Equals(ip2[i]);
  555.  
  556.                 if (isMatchUp)
  557.                     mask = mask + "1";
  558.                 else
  559.                     mask = mask + "0";
  560.             }
  561.             byte b1, b2, b3, b4;
  562.             b1 = Convert.ToByte(mask.Substring(0, 8), 2);
  563.             b2 = Convert.ToByte(mask.Substring(8, 8), 2);
  564.             b3 = Convert.ToByte(mask.Substring(16, 8), 2);
  565.             b4 = Convert.ToByte(mask.Substring(24, 8), 2);
  566.  
  567.             return new IPAddress(new byte[] { b1, b2, b3, b4 });
  568.         }
  569.  
  570.         public static String IPAddressToBinaryString(IPAddress ip)
  571.         {
  572.             String charArray =
  573.                 ResizeTo(Convert.ToString(ip.GetAddressBytes()[0], 2), 8) +
  574.                 ResizeTo(Convert.ToString(ip.GetAddressBytes()[1], 2), 8) +
  575.                 ResizeTo(Convert.ToString(ip.GetAddressBytes()[2], 2), 8) +
  576.                 ResizeTo(Convert.ToString(ip.GetAddressBytes()[3], 2), 8);
  577.             return charArray;
  578.         }
  579.  
  580.         private static String ResizeTo(String str, int size)
  581.         {
  582.             while (str.Length < size)
  583.                 str = "0" + str;
  584.             return str;
  585.         }
  586.     }
  587. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement