1using System;
2using System.Net;
3using System.Net.Sockets;
4using System.Text;
5class SNMP
6{
7 public SNMP()
8 {
9 }
10 public byte[] get(string request, string host, string community, string_ mibstring)
11 {
12 byte[] packet = new byte[1024];
13 byte[] mib = new byte[1024];
14 int snmplen;
15 int comlen = community.Length;
16 string[] mibvals = mibstring.Split('.');
17 int miblen = mibvals.Length;
18 int cnt = 0, temp, i;
19 int orgmiblen = miblen;
20 int pos = 0;
21 // Convert the string MIB into a byte array of integer values
22 // Unfortunately, values over 128 require multiple bytes
23 // which also increases the MIB length
24 for (i = 0; i < orgmiblen; i++)
25 {
26 temp = Convert.ToInt16(mibvals[i]);
27 if (temp > 127)
28 {
29 mib[cnt] = Convert.ToByte(128 + (temp / 128));
30 mib[cnt + 1] = Convert.ToByte(temp - ((temp / 128) * 128));
31 cnt += 2;
32 miblen++;
33 } else
34 {
35 mib[cnt] = Convert.ToByte(temp);
36 cnt++;
37 }
38 }
39 snmplen = 29 + comlen + miblen - 1; //Length of entire SNMP packet
40 //The SNMP sequence start
41 packet[pos++] = 0x30; //Sequence start
42 packet[pos++] = Convert.ToByte(snmplen - 2); //sequence size
43 //SNMP version
44 packet[pos++] = 0x02; //Integer type
45 packet[pos++] = 0x01; //length
46 packet[pos++] = 0x00; //SNMP version 1
47 //Community name
48 packet[pos++] = 0x04; // String type
49 packet[pos++] = Convert.ToByte(comlen); //length
50 //Convert community name to byte array
51 byte[] data = Encoding.ASCII.GetBytes(community);
52 for (i = 0; i < data.Length; i++)
53 {
54 packet[pos++] = data[i];
55 }
56 //Add GetRequest or GetNextRequest value
57 if (request == "get")
58 packet[pos++] = 0xA0;
59 else
60 packet[pos++] = 0xA1;
61 packet[pos++] = Convert.ToByte(20 + miblen - 1); //Size of total MIB
62 //Request ID
63 packet[pos++] = 0x02; //Integer type
64 packet[pos++] = 0x04; //length
65 packet[pos++] = 0x00; //SNMP request ID
66 packet[pos++] = 0x00;
67 packet[pos++] = 0x00;
68 packet[pos++] = 0x01;
69 //Error status
70 packet[pos++] = 0x02; //Integer type
71 packet[pos++] = 0x01; //length
72 packet[pos++] = 0x00; //SNMP error status
73 //Error index
74 packet[pos++] = 0x02; //Integer type
75 packet[pos++] = 0x01; //length
76 packet[pos++] = 0x00; //SNMP error index
77 //Start of variable bindings
78 packet[pos++] = 0x30; //Start of variable bindings sequence
79 packet[pos++] = Convert.ToByte(6 + miblen - 1); // Size of variable binding
80 packet[pos++] = 0x30; //Start of first variable bindings sequence
81 packet[pos++] = Convert.ToByte(6 + miblen - 1 - 2); // size
82 packet[pos++] = 0x06; //Object type
83 packet[pos++] = Convert.ToByte(miblen - 1); //length
84 //Start of MIB
85 packet[pos++] = 0x2b;
86 //Place MIB array in packet
87 for(i = 2; i < miblen; i++)
88 packet[pos++] = Convert.ToByte(mib[i]);
89 packet[pos++] = 0x05; //Null object value
90 packet[pos++] = 0x00; //Null
91 //Send packet to destination
92 Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram,
93 ProtocolType.Udp);
94 sock.SetSocketOption(SocketOptionLevel.Socket,
95 SocketOptionName.ReceiveTimeout, 5000);
96 IPHostEntry ihe = Dns.Resolve(host);
97 IPEndPoint iep = new IPEndPoint(ihe.AddressList[0], 161);
98 EndPoint ep = (EndPoint)iep;
99 sock.SendTo(packet, snmplen, SocketFlags.None, iep);
100 //Receive response from packet
101 try
102 {
103 int recv = sock.ReceiveFrom(packet, ref ep);
104 } catch (SocketException)
105 {
106 packet[0] = 0xff;
107 }
108 return packet;
109 }
110}
111
2using System.Net;
3using System.Net.Sockets;
4using System.Text;
5class SNMP
6{
7 public SNMP()
8 {
9 }
10 public byte[] get(string request, string host, string community, string_ mibstring)
11 {
12 byte[] packet = new byte[1024];
13 byte[] mib = new byte[1024];
14 int snmplen;
15 int comlen = community.Length;
16 string[] mibvals = mibstring.Split('.');
17 int miblen = mibvals.Length;
18 int cnt = 0, temp, i;
19 int orgmiblen = miblen;
20 int pos = 0;
21 // Convert the string MIB into a byte array of integer values
22 // Unfortunately, values over 128 require multiple bytes
23 // which also increases the MIB length
24 for (i = 0; i < orgmiblen; i++)
25 {
26 temp = Convert.ToInt16(mibvals[i]);
27 if (temp > 127)
28 {
29 mib[cnt] = Convert.ToByte(128 + (temp / 128));
30 mib[cnt + 1] = Convert.ToByte(temp - ((temp / 128) * 128));
31 cnt += 2;
32 miblen++;
33 } else
34 {
35 mib[cnt] = Convert.ToByte(temp);
36 cnt++;
37 }
38 }
39 snmplen = 29 + comlen + miblen - 1; //Length of entire SNMP packet
40 //The SNMP sequence start
41 packet[pos++] = 0x30; //Sequence start
42 packet[pos++] = Convert.ToByte(snmplen - 2); //sequence size
43 //SNMP version
44 packet[pos++] = 0x02; //Integer type
45 packet[pos++] = 0x01; //length
46 packet[pos++] = 0x00; //SNMP version 1
47 //Community name
48 packet[pos++] = 0x04; // String type
49 packet[pos++] = Convert.ToByte(comlen); //length
50 //Convert community name to byte array
51 byte[] data = Encoding.ASCII.GetBytes(community);
52 for (i = 0; i < data.Length; i++)
53 {
54 packet[pos++] = data[i];
55 }
56 //Add GetRequest or GetNextRequest value
57 if (request == "get")
58 packet[pos++] = 0xA0;
59 else
60 packet[pos++] = 0xA1;
61 packet[pos++] = Convert.ToByte(20 + miblen - 1); //Size of total MIB
62 //Request ID
63 packet[pos++] = 0x02; //Integer type
64 packet[pos++] = 0x04; //length
65 packet[pos++] = 0x00; //SNMP request ID
66 packet[pos++] = 0x00;
67 packet[pos++] = 0x00;
68 packet[pos++] = 0x01;
69 //Error status
70 packet[pos++] = 0x02; //Integer type
71 packet[pos++] = 0x01; //length
72 packet[pos++] = 0x00; //SNMP error status
73 //Error index
74 packet[pos++] = 0x02; //Integer type
75 packet[pos++] = 0x01; //length
76 packet[pos++] = 0x00; //SNMP error index
77 //Start of variable bindings
78 packet[pos++] = 0x30; //Start of variable bindings sequence
79 packet[pos++] = Convert.ToByte(6 + miblen - 1); // Size of variable binding
80 packet[pos++] = 0x30; //Start of first variable bindings sequence
81 packet[pos++] = Convert.ToByte(6 + miblen - 1 - 2); // size
82 packet[pos++] = 0x06; //Object type
83 packet[pos++] = Convert.ToByte(miblen - 1); //length
84 //Start of MIB
85 packet[pos++] = 0x2b;
86 //Place MIB array in packet
87 for(i = 2; i < miblen; i++)
88 packet[pos++] = Convert.ToByte(mib[i]);
89 packet[pos++] = 0x05; //Null object value
90 packet[pos++] = 0x00; //Null
91 //Send packet to destination
92 Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram,
93 ProtocolType.Udp);
94 sock.SetSocketOption(SocketOptionLevel.Socket,
95 SocketOptionName.ReceiveTimeout, 5000);
96 IPHostEntry ihe = Dns.Resolve(host);
97 IPEndPoint iep = new IPEndPoint(ihe.AddressList[0], 161);
98 EndPoint ep = (EndPoint)iep;
99 sock.SendTo(packet, snmplen, SocketFlags.None, iep);
100 //Receive response from packet
101 try
102 {
103 int recv = sock.ReceiveFrom(packet, ref ep);
104 } catch (SocketException)
105 {
106 packet[0] = 0xff;
107 }
108 return packet;
109 }
110}
111
只能实现一次绑定一个变量,效率不高
如果在resquest中绑定多个变量,解析Response的变量值总不对,不知那位有这方面的经验,指点一下!