Advertisement
inf926k

Untitled

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