一个SNMP类!
1
using System;
2
using System.Net;
3
using System.Net.Sockets;
4
using System.Text;
5
class 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
using System;2
using System.Net;3
using System.Net.Sockets;4
using System.Text;5
class SNMP6


{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 values22
// Unfortunately, values over 128 require multiple bytes23
// which also increases the MIB length24
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
} else34

{35
mib[cnt] = Convert.ToByte(temp);36
cnt++;37
}38
}39
snmplen = 29 + comlen + miblen - 1; //Length of entire SNMP packet40
//The SNMP sequence start41
packet[pos++] = 0x30; //Sequence start42
packet[pos++] = Convert.ToByte(snmplen - 2); //sequence size43
//SNMP version44
packet[pos++] = 0x02; //Integer type45
packet[pos++] = 0x01; //length46
packet[pos++] = 0x00; //SNMP version 147
//Community name48
packet[pos++] = 0x04; // String type49
packet[pos++] = Convert.ToByte(comlen); //length50
//Convert community name to byte array51
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 value57
if (request == "get")58
packet[pos++] = 0xA0;59
else60
packet[pos++] = 0xA1;61
packet[pos++] = Convert.ToByte(20 + miblen - 1); //Size of total MIB62
//Request ID63
packet[pos++] = 0x02; //Integer type64
packet[pos++] = 0x04; //length65
packet[pos++] = 0x00; //SNMP request ID66
packet[pos++] = 0x00;67
packet[pos++] = 0x00;68
packet[pos++] = 0x01;69
//Error status70
packet[pos++] = 0x02; //Integer type71
packet[pos++] = 0x01; //length72
packet[pos++] = 0x00; //SNMP error status73
//Error index74
packet[pos++] = 0x02; //Integer type75
packet[pos++] = 0x01; //length76
packet[pos++] = 0x00; //SNMP error index77
//Start of variable bindings78
packet[pos++] = 0x30; //Start of variable bindings sequence79
packet[pos++] = Convert.ToByte(6 + miblen - 1); // Size of variable binding80
packet[pos++] = 0x30; //Start of first variable bindings sequence81
packet[pos++] = Convert.ToByte(6 + miblen - 1 - 2); // size82
packet[pos++] = 0x06; //Object type83
packet[pos++] = Convert.ToByte(miblen - 1); //length84
//Start of MIB85
packet[pos++] = 0x2b;86
//Place MIB array in packet87
for(i = 2; i < miblen; i++)88
packet[pos++] = Convert.ToByte(mib[i]);89
packet[pos++] = 0x05; //Null object value90
packet[pos++] = 0x00; //Null91
//Send packet to destination92
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 packet101
try102

{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的变量值总不对,不知那位有这方面的经验,指点一下!