C#简单实现SNMP的方法

 更新时间:2015年07月15日 16:05:33   作者:红薯  
这篇文章主要介绍了C#简单实现SNMP的方法,通过一个简单的自定义类分析了C#实现SNMP的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下

本文实例讲述了C#简单实现SNMP的方法。分享给大家供大家参考。具体如下:

/**
C# Network Programming 
by Richard Blum
Publisher: Sybex 
ISBN: 0782141765
*/
using System;
using System.Text;
using System.Net;
using System.Net.Sockets;
public class SimpleSNMP
{
  public static void Main(string[] argv)
  {
   int commlength, miblength, datatype, datalength, datastart;
   int uptime = 0;
   string output;
   SNMP conn = new SNMP();
   byte[] response = new byte[1024];
   Console.WriteLine("Device SNMP information:");
   // Send sysName SNMP request
   response = conn.get("get", argv[0], argv[1], "1.3.6.1.2.1.1.5.0");
   if (response[0] == 0xff)
   {
     Console.WriteLine("No response from {0}", argv[0]);
     return;
   }
   // If response, get the community name and MIB lengths
   commlength = Convert.ToInt16(response[6]);
   miblength = Convert.ToInt16(response[23 + commlength]);
   // Extract the MIB data from the SNMP response
   datatype = Convert.ToInt16(response[24 + commlength + miblength]);
   datalength = Convert.ToInt16(response[25 + commlength + miblength]);
   datastart = 26 + commlength + miblength;
   output = Encoding.ASCII.GetString(response, datastart, datalength);
   Console.WriteLine(" sysName - Datatype: {0}, Value: {1}",
       datatype, output);
   // Send a sysLocation SNMP request
   response = conn.get("get", argv[0], argv[1], "1.3.6.1.2.1.1.6.0");
   if (response[0] == 0xff)
   {
     Console.WriteLine("No response from {0}", argv[0]);
     return;
   }
   // If response, get the community name and MIB lengths
   commlength = Convert.ToInt16(response[6]);
   miblength = Convert.ToInt16(response[23 + commlength]);
   // Extract the MIB data from the SNMP response
   datatype = Convert.ToInt16(response[24 + commlength + miblength]);
   datalength = Convert.ToInt16(response[25 + commlength + miblength]);
   datastart = 26 + commlength + miblength;
   output = Encoding.ASCII.GetString(response, datastart, datalength);
   Console.WriteLine(" sysLocation - Datatype: {0}, Value: {1}", datatype, output);
   // Send a sysContact SNMP request
   response = conn.get("get", argv[0], argv[1], "1.3.6.1.2.1.1.4.0");
   if (response[0] == 0xff)
   {
     Console.WriteLine("No response from {0}", argv[0]);
     return;
   }
   // Get the community and MIB lengths
   commlength = Convert.ToInt16(response[6]);
   miblength = Convert.ToInt16(response[23 + commlength]);
   // Extract the MIB data from the SNMP response
   datatype = Convert.ToInt16(response[24 + commlength + miblength]);
   datalength = Convert.ToInt16(response[25 + commlength + miblength]);
   datastart = 26 + commlength + miblength;
   output = Encoding.ASCII.GetString(response, datastart, datalength);
   Console.WriteLine(" sysContact - Datatype: {0}, Value: {1}",
       datatype, output);
   // Send a SysUptime SNMP request
   response = conn.get("get", argv[0], argv[1], "1.3.6.1.2.1.1.3.0");
   if (response[0] == 0xff)
   {
     Console.WriteLine("No response from {0}", argv[0]);
     return;
   }
   // Get the community and MIB lengths of the response
   commlength = Convert.ToInt16(response[6]);
   miblength = Convert.ToInt16(response[23 + commlength]);
   // Extract the MIB data from the SNMp response
   datatype = Convert.ToInt16(response[24 + commlength + miblength]);
   datalength = Convert.ToInt16(response[25 + commlength + miblength]);
   datastart = 26 + commlength + miblength;
   // The sysUptime value may by a multi-byte integer
   // Each byte read must be shifted to the higher byte order
   while(datalength > 0)
   {
     uptime = (uptime << 8) + response[datastart++];
     datalength--;
   }
   Console.WriteLine(" sysUptime - Datatype: {0}, Value: {1}",
       datatype, uptime);
  }
}
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]);
      //ERROR here, it should be mibvalue = (mibvalue-128)*128 + Convert.ToInt16(mibin[i+1]);
      //for mib values greater than 128, the math is not adding up correctly  
      i++;
     }
     output += "." + mibvalue;
   }
   return output;
  }
}

希望本文所述对大家的C#程序设计有所帮助。

相关文章

  • C#基础语法:Base关键字学习笔记

    C#基础语法:Base关键字学习笔记

    这篇文章主要介绍了C#基础语法:Base关键字学习笔记,本文讲解了它的一些基础知识以及测试代码,需要的朋友可以参考下
    2015-06-06
  • C#  ADO.NET 离线查询的实现示例

    C# ADO.NET 离线查询的实现示例

    这篇文章主要介绍了C# ADO.NET 离线查询的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-05-05
  • C# #define条件编译详解

    C# #define条件编译详解

    这篇文章主要介绍了C# #define条件编译,告诉大家#define是用来做什么?如何使用#define,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-01-01
  • C# 模式匹配完全指南

    C# 模式匹配完全指南

    模式匹配是一种高端的使用机制,它允许程序员在开发的时候以对象的类型作为条件筛选和分情况处理的一种手段,本文给大家介绍C# 模式匹配完全指南,感兴趣的朋友跟随小编一起看看吧
    2022-03-03
  • C# winform分页查询的实现示例

    C# winform分页查询的实现示例

    这篇文章主要介绍了C# winform分页查询的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • C# 实现FTP上传资料的示例

    C# 实现FTP上传资料的示例

    这篇文章主要介绍了C# 实现FTP上传资料的示例,帮助大家更好的理解和学习c#,感兴趣的朋友可以了解下
    2020-12-12
  • Unity3D实现物体旋转缩放移动效果

    Unity3D实现物体旋转缩放移动效果

    这篇文章主要为大家详细介绍了Unity3D实现物体旋转缩放移动效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-02-02
  • C#可选参数的相关使用

    C#可选参数的相关使用

    .net framework 4.0新增加了可选参数的支持,其实很简单,只要给参数赋个默认值就可以了
    2013-05-05
  • C# 数组删除元素的实现示例

    C# 数组删除元素的实现示例

    本文主要介绍了C# 数组删除元素的实现示例,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • 基于Unity3D实现3D迷宫小游戏的示例代码

    基于Unity3D实现3D迷宫小游戏的示例代码

    迷宫游戏作为经典的小游戏,一直深受大家的喜爱。本文小编将为大家详细介绍一下如何用Unity实现一个3D版的迷宫小游戏,感兴趣的可以动手试一试
    2022-03-03

最新评论