Mega Code Archive

 
Categories / C# / Network
 

Cisco Router

/* C# Network Programming  by Richard Blum Publisher: Sybex  ISBN: 0782141765 */ using System.Net; using System.Net.Sockets; using System; using System.Drawing; using System.IO; using System.Threading; using System.Windows.Forms; public class CiscoRouter : Form {    private TextBox host;    private TextBox community;    private ListBox results;    private Thread monitor;    private FileStream fs;    private StreamWriter sw;    public CiscoRouter()    {       Text = "Cisco Router Utilization";       Size = new Size(400, 380);       Label label1 = new Label();       label1.Parent = this;       label1.Text = "Host:";       label1.AutoSize = true;       label1.Location = new Point(10, 30);       host = new TextBox();       host.Parent = this;       host.Size = new Size(170, 2 * Font.Height);       host.Location = new Point(40, 27);       Label label2 = new Label();       label2.Parent = this;       label2.Text = "Community:";       label2.AutoSize = true;       label2.Location = new Point(10, 60);       community = new TextBox();       community.Parent = this;       community.Size = new Size(170, 2 * Font.Height);       community.Location = new Point(75, 57);       results = new ListBox();       results.Parent = this;       results.Location = new Point(10, 85);       results.Size = new Size(360, 18 * Font.Height);       Button start = new Button();       start.Parent = this;       start.Text = "Start";       start.Location = new Point(250, 52);       start.Size = new Size(5 * Font.Height, 2 * Font.Height);       start.Click += new EventHandler(ButtonStartOnClick);       Button stop = new Button();       stop.Parent = this;       stop.Text = "Stop";       stop.Location = new Point(320, 52);       stop.Size = new Size(5 * Font.Height, 2 * Font.Height);       stop.Click += new EventHandler(ButtonStopOnClick);    }    void ButtonStartOnClick(Object obj, EventArgs ea)    {       monitor = new Thread(new ThreadStart(checkRouter));       monitor.IsBackground = true;       monitor.Start();    }    void ButtonStopOnClick(Object obj, EventArgs ea)    {       monitor.Abort();       sw.Close();       fs.Close();    }    void checkRouter()    {       int commlength, miblength, datastart, cpuUtil;       SNMP conn = new SNMP();       byte[] response = new byte[1024];       DateTime time;       string logFile = "routerlog.txt";       fs = new FileStream(logFile, FileMode.OpenOrCreate,             FileAccess.ReadWrite);       sw = new StreamWriter(fs);       while (true)       {          response = conn.get("get", host.Text,              community.Text, "1.3.6.1.4.1.9.2.1.58.0");          if (response[0] == 0xff)          {             results.Items.Add("No reponse from host");             sw.WriteLine("No response from host");             sw.Flush();             break;          }          commlength = Convert.ToInt16(response[6]);          miblength = Convert.ToInt16(response[23 + commlength]);          datastart = 26 + commlength + miblength;          cpuUtil = Convert.ToInt16(response[datastart]);          time = DateTime.Now;          results.Items.Add(time + " CPU Utilization: " + cpuUtil + "%");          sw.WriteLine("{0} CPU Utilization: {1}%", time, cpuUtil);          sw.Flush();          Thread.Sleep(5 * 60000);       }    }    public static void Main()    {       Application.Run(new CiscoRouter());    } } class SNMP {    public SNMP()    {    }    public byte[] get(string request, string host, string community, string mibstring)    {       byte[] packet = new byte[1024];       byte[] mib = new byte[1024];       int snmplen;       int comlen = community.Length;       string[] mibvals = mibstring.Split('.');       int miblen = mibvals.Length;       int cnt = 0, temp, i;       int orgmiblen = miblen;       int pos = 0;       // Convert the string MIB into a byte array of integer values       // Unfortunately, values over 128 require multiple bytes       // which also increases the MIB length       for (i = 0; i < orgmiblen; i++)       {          temp = Convert.ToInt16(mibvals[i]);          if (temp > 127)          {             mib[cnt] = Convert.ToByte(128 + (temp / 128));             mib[cnt + 1] = Convert.ToByte(temp - ((temp / 128) * 128));             cnt += 2;             miblen++;          } else          {             mib[cnt] = Convert.ToByte(temp);             cnt++;          }       }       snmplen = 29 + comlen + miblen - 1;  //Length of entire SNMP packet       //The SNMP sequence start       packet[pos++] = 0x30; //Sequence start       packet[pos++] = Convert.ToByte(snmplen - 2);  //sequence size       //SNMP version       packet[pos++] = 0x02; //Integer type       packet[pos++] = 0x01; //length       packet[pos++] = 0x00; //SNMP version 1       //Community name       packet[pos++] = 0x04; // String type       packet[pos++] = Convert.ToByte(comlen); //length       //Convert community name to byte array       byte[] data = Encoding.ASCII.GetBytes(community);       for (i = 0; i < data.Length; i++)       {          packet[pos++] = data[i];       }       //Add GetRequest or GetNextRequest value       if (request == "get")          packet[pos++] = 0xA0;       else          packet[pos++] = 0xA1;       packet[pos++] = Convert.ToByte(20 + miblen - 1); //Size of total MIB       //Request ID       packet[pos++] = 0x02; //Integer type       packet[pos++] = 0x04; //length       packet[pos++] = 0x00; //SNMP request ID       packet[pos++] = 0x00;       packet[pos++] = 0x00;       packet[pos++] = 0x01;       //Error status       packet[pos++] = 0x02; //Integer type       packet[pos++] = 0x01; //length       packet[pos++] = 0x00; //SNMP error status       //Error index       packet[pos++] = 0x02; //Integer type       packet[pos++] = 0x01; //length       packet[pos++] = 0x00; //SNMP error index       //Start of variable bindings       packet[pos++] = 0x30; //Start of variable bindings sequence       packet[pos++] = Convert.ToByte(6 + miblen - 1); // Size of variable binding       packet[pos++] = 0x30; //Start of first variable bindings sequence       packet[pos++] = Convert.ToByte(6 + miblen - 1 - 2); // size       packet[pos++] = 0x06; //Object type       packet[pos++] = Convert.ToByte(miblen - 1); //length       //Start of MIB       packet[pos++] = 0x2b;       //Place MIB array in packet       for(i = 2; i < miblen; i++)          packet[pos++] = Convert.ToByte(mib[i]);       packet[pos++] = 0x05; //Null object value       packet[pos++] = 0x00; //Null       //Send packet to destination       Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram,                        ProtocolType.Udp);       sock.SetSocketOption(SocketOptionLevel.Socket,                       SocketOptionName.ReceiveTimeout, 5000);       IPHostEntry ihe = Dns.Resolve(host);       IPEndPoint iep = new IPEndPoint(ihe.AddressList[0], 161);       EndPoint ep = (EndPoint)iep;       sock.SendTo(packet, snmplen, SocketFlags.None, iep);       //Receive response from packet       try       {          int recv = sock.ReceiveFrom(packet, ref ep);       } catch (SocketException)       {          packet[0] = 0xff;       }       return packet;    }    public string getnextMIB(byte[] mibin)    {       string output = "1.3";       int commlength = mibin[6];       int mibstart = 6 + commlength + 17; //find the start of the mib section       //The MIB length is the length defined in the SNMP packet      // minus 1 to remove the ending .0, which is not used       int miblength = mibin[mibstart] - 1;       mibstart += 2; //skip over the length and 0x2b values       int mibvalue;       for(int i = mibstart; i < mibstart + miblength; i++)       {          mibvalue = Convert.ToInt16(mibin[i]);          if (mibvalue > 128)          {             mibvalue = (mibvalue/128)*128 + Convert.ToInt16(mibin[i+1]);             i++;          }          output += "." + mibvalue;       }       return output;    } }