Click here to Skip to main content
15,886,815 members
Please Sign up or sign in to vote.
5.00/5 (2 votes)
See more:
Hi. I am a fresh graduate and have just got my first job as a programmer in Hong Kong. As the topic described, I need to use C# to control the ports on the Cisco switch.

I have search and study for quite a long time so I have the basic knowledge about SNMP and MIB. I can find some articles talking about how to manage a cisco switch but none of them specified how do I enable and disable ports. At this moment I think I need to config the switch so that it enable the SNMP service, then I should send a SNMP Set packet to turn on/off the particular port. Is it correct?

Anyone have some experience on it and like to share with me? Please leave some suggestion. And if you have read some useful websites before, please kindly leave the url here so I can have a look too.

Thank you so much for your attention.
Posted

Firstly here is a good documentation :

http://oreilly.com/catalog/esnmp/chapter/ch02.html[^]

Here is a code snippet which communicated with a router :

C#
/*
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;
   }
}

Extracted from here:
http://www.java2s.com/Code/CSharp/Network/CiscoRouter.htm[^]


Working with SNMP is somehow device specific so you can not find a library which provide you facilities like :
C#
Routers[0].Ports[4].Enabled = false ;


So it seems that you are going to have a lot of studying and debugging to find out how to do this.

Hope it helps.
 
Share this answer
 
v2
Comments
El_Codero 5-Mar-12 18:23pm    
Oh, remembering to CCNA times, thanks for sharing this code.My 5! Best Regards
Amir Mahfoozi 5-Mar-12 23:41pm    
Thanks Bjorn :)
Member 7881518 15-Apr-12 9:16am    
I am using same code, it is working for localhost but it is throws exception when tested on actual network.The exception is thrown at ReceiveFrom statement.
Please reply if you have any idea
I hope the following link will give you some idea.

http://www.cisco.com/en/US/products/hw/switches/ps708/products_tech_note09186a008015c612.shtml[^]

You Have to find what are the addresses of ports and the command to activate it.

After That u can enable or disable the ports in C#

Also refer the datasheet of Cisco Catalyst 2960. Usually the datasheet consists all such details of the product.
 
Share this answer
 

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900