首页 > 编程 > C# > 正文

C#简单实现SNMP的方法

2019-10-29 21:41:07
字体:
来源:转载
供稿:网友

这篇文章主要介绍了C#简单实现SNMP的方法,通过一个简单的自定义类分析了C#实现SNMP的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下

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

 

 
  1. /** 
  2. C# Network Programming  
  3. by Richard Blum 
  4. Publisher: Sybex  
  5. ISBN: 0782141765 
  6. */ 
  7. using System; 
  8. using System.Text; 
  9. using System.Net; 
  10. using System.Net.Sockets; 
  11. public class SimpleSNMP 
  12. public static void Main(string[] argv) 
  13. int commlength, miblength, datatype, datalength, datastart; 
  14. int uptime = 0; 
  15. string output; 
  16. SNMP conn = new SNMP(); 
  17. byte[] response = new byte[1024]; 
  18. Console.WriteLine("Device SNMP information:"); 
  19. // Send sysName SNMP request 
  20. response = conn.get("get", argv[0], argv[1], "1.3.6.1.2.1.1.5.0"); 
  21. if (response[0] == 0xff) 
  22. Console.WriteLine("No response from {0}", argv[0]); 
  23. return
  24. // If response, get the community name and MIB lengths 
  25. commlength = Convert.ToInt16(response[6]); 
  26. miblength = Convert.ToInt16(response[23 + commlength]); 
  27. // Extract the MIB data from the SNMP response 
  28. datatype = Convert.ToInt16(response[24 + commlength + miblength]); 
  29. datalength = Convert.ToInt16(response[25 + commlength + miblength]); 
  30. datastart = 26 + commlength + miblength; 
  31. output = Encoding.ASCII.GetString(response, datastart, datalength); 
  32. Console.WriteLine(" sysName - Datatype: {0}, Value: {1}"
  33. datatype, output); 
  34. // Send a sysLocation SNMP request 
  35. response = conn.get("get", argv[0], argv[1], "1.3.6.1.2.1.1.6.0"); 
  36. if (response[0] == 0xff) 
  37. Console.WriteLine("No response from {0}", argv[0]); 
  38. return
  39. // If response, get the community name and MIB lengths 
  40. commlength = Convert.ToInt16(response[6]); 
  41. miblength = Convert.ToInt16(response[23 + commlength]); 
  42. // Extract the MIB data from the SNMP response 
  43. datatype = Convert.ToInt16(response[24 + commlength + miblength]); 
  44. datalength = Convert.ToInt16(response[25 + commlength + miblength]); 
  45. datastart = 26 + commlength + miblength; 
  46. output = Encoding.ASCII.GetString(response, datastart, datalength); 
  47. Console.WriteLine(" sysLocation - Datatype: {0}, Value: {1}", datatype, output); 
  48. // Send a sysContact SNMP request 
  49. response = conn.get("get", argv[0], argv[1], "1.3.6.1.2.1.1.4.0"); 
  50. if (response[0] == 0xff) 
  51. Console.WriteLine("No response from {0}", argv[0]); 
  52. return
  53. // Get the community and MIB lengths 
  54. commlength = Convert.ToInt16(response[6]); 
  55. miblength = Convert.ToInt16(response[23 + commlength]); 
  56. // Extract the MIB data from the SNMP response 
  57. datatype = Convert.ToInt16(response[24 + commlength + miblength]); 
  58. datalength = Convert.ToInt16(response[25 + commlength + miblength]); 
  59. datastart = 26 + commlength + miblength; 
  60. output = Encoding.ASCII.GetString(response, datastart, datalength); 
  61. Console.WriteLine(" sysContact - Datatype: {0}, Value: {1}"
  62. datatype, output); 
  63. // Send a SysUptime SNMP request 
  64. response = conn.get("get", argv[0], argv[1], "1.3.6.1.2.1.1.3.0"); 
  65. if (response[0] == 0xff) 
  66. Console.WriteLine("No response from {0}", argv[0]); 
  67. return
  68. // Get the community and MIB lengths of the response 
  69. commlength = Convert.ToInt16(response[6]); 
  70. miblength = Convert.ToInt16(response[23 + commlength]); 
  71. // Extract the MIB data from the SNMp response 
  72. datatype = Convert.ToInt16(response[24 + commlength + miblength]); 
  73. datalength = Convert.ToInt16(response[25 + commlength + miblength]); 
  74. datastart = 26 + commlength + miblength; 
  75. // The sysUptime value may by a multi-byte integer 
  76. // Each byte read must be shifted to the higher byte order 
  77. while(datalength > 0) 
  78. uptime = (uptime << 8) + response[datastart++]; 
  79. datalength--; 
  80. Console.WriteLine(" sysUptime - Datatype: {0}, Value: {1}"
  81. datatype, uptime); 
  82. class SNMP 
  83. public SNMP() 
  84. public byte[] get(string request, string host, string community, string mibstring) 
  85. byte[] packet = new byte[1024]; 
  86. byte[] mib = new byte[1024]; 
  87. int snmplen; 
  88. int comlen = community.Length; 
  89. string[] mibvals = mibstring.Split('.'); 
  90. int miblen = mibvals.Length; 
  91. int cnt = 0, temp, i; 
  92. int orgmiblen = miblen; 
  93. int pos = 0; 
  94. // Convert the string MIB into a byte array of integer values 
  95. // Unfortunately, values over 128 require multiple bytes 
  96. // which also increases the MIB length 
  97. for (i = 0; i < orgmiblen; i++) 
  98. temp = Convert.ToInt16(mibvals[i]); 
  99. if (temp > 127) 
  100. mib[cnt] = Convert.ToByte(128 + (temp / 128)); 
  101. mib[cnt + 1] = Convert.ToByte(temp - ((temp / 128) * 128)); 
  102. cnt += 2; 
  103. miblen++; 
  104. else 
  105. mib[cnt] = Convert.ToByte(temp); 
  106. cnt++; 
  107. snmplen = 29 + comlen + miblen - 1; //Length of entire SNMP packet 
  108. //The SNMP sequence start 
  109. packet[pos++] = 0x30; //Sequence start 
  110. packet[pos++] = Convert.ToByte(snmplen - 2); //sequence size 
  111. //SNMP version 
  112. packet[pos++] = 0x02; //Integer type 
  113. packet[pos++] = 0x01; //length 
  114. packet[pos++] = 0x00; //SNMP version 1 
  115. //Community name 
  116. packet[pos++] = 0x04; // String type 
  117. packet[pos++] = Convert.ToByte(comlen); //length 
  118. //Convert community name to byte array 
  119. byte[] data = Encoding.ASCII.GetBytes(community); 
  120. for (i = 0; i < data.Length; i++) 
  121. packet[pos++] = data[i]; 
  122. //Add GetRequest or GetNextRequest value 
  123. if (request == "get"
  124. packet[pos++] = 0xA0; 
  125. else 
  126. packet[pos++] = 0xA1; 
  127. packet[pos++] = Convert.ToByte(20 + miblen - 1); //Size of total MIB 
  128. //Request ID 
  129. packet[pos++] = 0x02; //Integer type 
  130. packet[pos++] = 0x04; //length 
  131. packet[pos++] = 0x00; //SNMP request ID 
  132. packet[pos++] = 0x00; 
  133. packet[pos++] = 0x00; 
  134. packet[pos++] = 0x01; 
  135. //Error status 
  136. packet[pos++] = 0x02; //Integer type 
  137. packet[pos++] = 0x01; //length 
  138. packet[pos++] = 0x00; //SNMP error status 
  139. //Error index 
  140. packet[pos++] = 0x02; //Integer type 
  141. packet[pos++] = 0x01; //length 
  142. packet[pos++] = 0x00; //SNMP error index 
  143. //Start of variable bindings 
  144. packet[pos++] = 0x30; //Start of variable bindings sequence 
  145. packet[pos++] = Convert.ToByte(6 + miblen - 1); // Size of variable binding 
  146. packet[pos++] = 0x30; //Start of first variable bindings sequence 
  147. packet[pos++] = Convert.ToByte(6 + miblen - 1 - 2); // size 
  148. packet[pos++] = 0x06; //Object type 
  149. packet[pos++] = Convert.ToByte(miblen - 1); //length 
  150. //Start of MIB 
  151. packet[pos++] = 0x2b; 
  152. //Place MIB array in packet 
  153. for(i = 2; i < miblen; i++) 
  154. packet[pos++] = Convert.ToByte(mib[i]); 
  155. packet[pos++] = 0x05; //Null object value 
  156. packet[pos++] = 0x00; //Null 
  157. //Send packet to destination 
  158. Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, 
  159. ProtocolType.Udp); 
  160. sock.SetSocketOption(SocketOptionLevel.Socket, 
  161. SocketOptionName.ReceiveTimeout, 5000); 
  162. IPHostEntry ihe = Dns.Resolve(host); 
  163. IPEndPoint iep = new IPEndPoint(ihe.AddressList[0], 161); 
  164. EndPoint ep = (EndPoint)iep; 
  165. sock.SendTo(packet, snmplen, SocketFlags.None, iep); 
  166. //Receive response from packet 
  167. try 
  168. int recv = sock.ReceiveFrom(packet, ref ep); 
  169. catch (SocketException) 
  170. packet[0] = 0xff; 
  171. return packet; 
  172. public string getnextMIB(byte[] mibin) 
  173. string output = "1.3"
  174. int commlength = mibin[6]; 
  175. int mibstart = 6 + commlength + 17; //find the start of the mib section 
  176. //The MIB length is the length defined in the SNMP packet 
  177. // minus 1 to remove the ending .0, which is not used 
  178. int miblength = mibin[mibstart] - 1; 
  179. mibstart += 2; //skip over the length and 0x2b values 
  180. int mibvalue; 
  181. for(int i = mibstart; i < mibstart + miblength; i++) 
  182. mibvalue = Convert.ToInt16(mibin[i]); 
  183. if (mibvalue > 128) 
  184. mibvalue = (mibvalue/128)*128 + Convert.ToInt16(mibin[i+1]); 
  185. //ERROR here, it should be mibvalue = (mibvalue-128)*128 + Convert.ToInt16(mibin[i+1]); 
  186. //for mib values greater than 128, the math is not adding up correctly  
  187. i++; 
  188. output += "." + mibvalue; 
  189. return output; 

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

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表