www.pudn.com > SNMP.rar > frmMain.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Windows.Forms;
namespace SNMP
{
public partial class frmMain : Form
{
string sysDescr = "1.3.6.1.2.1.1.1.0";
string sysOID = "1.3.6.1.2.1.1.2.0";
string sysUpTime = "1.3.6.1.2.1.1.3.0";
string sysContact = "1.3.6.1.2.1.1.4.0";
string sysName = "1.3.6.1.2.1.1.5.0";
string syslocation = "1.3.6.1.2.1.1.6.0";
string sysService = "1.3.6.1.2.1.1.7.0";
byte[] response = new byte[1024];
string[] DataHex = new string[7];
int ic = 0;
public frmMain()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
response = new byte[1024];
DataHex = new string[7];
btn_GetInfo();
}
private void 开始ToolStripMenuItem_Click(object sender, EventArgs e)
{
response = new byte[1024];
DataHex = new string[7];
btn_GetInfo();
}
private void button2_Click(object sender, EventArgs e)
{
//set
response = new byte[1024];
DataHex = new string[7];
SetInfo();
}
private void setlable(string str)
{
toolStripStatusLabel3.Text = str;
this.Refresh();
}
#region 显示数据
private void btn_GetInfo()
{
toolStripProgressBar1.Value = 0;
string hostIP = textBox1.Text;
string comm = textBox9.Text;
setlable("正在获取sysDescr...");
response = getinfo("get", hostIP, comm, sysDescr);
if (response[0] != 0xff)
{
string str = outputs(response);
textBox2.Text = str;
}
else
{
textBox2.Text = "没有响应";
}
toolStripProgressBar1.Value++;
setlable("正在获取sysObjectID...");
response = getinfo("get", hostIP, comm, sysOID);
if (response[0] != 0xff)
{
textBox3.Text = outputs(response);
}
else
{
textBox3.Text = "没有响应";
}
toolStripProgressBar1.Value++;
setlable("正在获取sysUpTime...");
response = getinfo("get", hostIP, "public", sysUpTime);
if (response[0] != 0xff)
{
textBox4.Text = outputs(response);
}
else
{
textBox4.Text = "没有响应";
}
toolStripProgressBar1.Value++;
setlable("正在获取sysContact...");
response = getinfo("get", hostIP, "public", sysContact);
if (response[0] != 0xff)
{
textBox8.Text = outputs(response);
}
else
{
textBox8.Text = "没有响应";
}
toolStripProgressBar1.Value++;
setlable("正在获取sysName...");
response = getinfo("get", hostIP, comm, sysName);
if (response[0] != 0xff)
{
textBox7.Text = outputs(response);
}
else
{
textBox7.Text = "没有响应";
}
toolStripProgressBar1.Value++;
setlable("正在获取syslocation...");
response = getinfo("get", hostIP, "public", syslocation);
if (response[0] != 0xff)
{
textBox6.Text = outputs(response);
}
else
{
textBox6.Text = "没有响应";
}
toolStripProgressBar1.Value++;
setlable("正在获取sysService...");
response = getinfo("get", hostIP, comm, sysService);
if (response[0] != 0xff)
{
textBox5.Text = outputs(response);
}
else
{
textBox5.Text = "没有响应";
}
toolStripProgressBar1.Value++;
setlable("全部获取完成...");
if (toolStripProgressBar1.Value > 7)
{
toolStripProgressBar1.Value = 0;
}
}
#endregion
#region 拆包
private string outputs(byte[] response)
{
string p = "";
//通过返回的数据类型进行不同格式的转换
int commlength, miblength, datatype, datalength, datastart;
int uptime = 0;
if (response[1] > 127)
{
commlength = Convert.ToInt16(response[7]);
miblength = Convert.ToInt16(response[27 + commlength]);
datatype = Convert.ToInt16(response[28 + commlength + miblength]);
datalength = 128 * (Convert.ToInt16(response[29 + commlength + miblength]) - 128) + Convert.ToInt16(response[30 + commlength + miblength]) % 128;
datastart = 31 + commlength + miblength;
}
else
{
commlength = Convert.ToInt16(response[6]);
miblength = Convert.ToInt16(response[23 + commlength]);
datatype = Convert.ToInt16(response[24 + commlength + miblength]);
datalength = Convert.ToInt16(response[25 + commlength + miblength]);
datastart = 26 + commlength + miblength;
}
if (datatype == 2)
{
//整形转换
int tempi = 0;
while (datalength > 0)
{
tempi = (tempi << 8) + response[datastart++];
datalength--;
}
p = tempi.ToString();
}
else if (datatype == 04)
{
//字符型转换
p = Encoding.ASCII.GetString(response, datastart, datalength);
}
else if (datatype == 67)
{
//序列转换
while (datalength > 0)
{
uptime = (uptime << 8) + response[datastart++];
datalength--;
}
p = uptime.ToString();
}
else if (datatype == 06)
{
//标示转换
p = "1.3.";
for (int i = datastart + 1; i < datastart + datalength - 1; i++)
{
if (i != datastart + datalength - 2)
{
p = p + Convert.ToInt16(response[i]).ToString() + ".";
}
else
{
p = p + Convert.ToInt16(response[i]).ToString();
}
}
}
return p;
}
#endregion
#region GetResponse
public byte[] getinfo(string request, string host, string community, string mibstring)
{
if (ic >= 7)
{
ic = 0;
}
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;
//将mib字符串格式转换为整数格式,如果整数的值大于128需要多个字节,同时也应该增加mib库的长度
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;
//snmp 包序列开始
packet[pos++] = 0x30;//包开始
packet[pos++] = Convert.ToByte(snmplen - 2);
//snmp 版本号
packet[pos++] = 0x02;//整数类型
packet[pos++] = 0x01;//长度
packet[pos++] = 0x00;//snmp 版本1
//团体名称
packet[pos++] = 0x04;//字符类型
packet[pos++] = Convert.ToByte(comlen);//团体名称长度
//转化团体名称到字符序列中
byte[] data = Encoding.ASCII.GetBytes(community);
for (i = 0; i < data.Length; i++)
{
packet[pos++] = data[i];
}
//添加GetRequest 或是GetNextRequest 值
if (request == "get")
{
packet[pos++] = 0xA0;
}
else
{
packet[pos++] = 0xA1;
}
packet[pos++] = Convert.ToByte(20 + miblen - 1);//mib的总长度
//Request ID
packet[pos++] = 0x02;//整数类型
packet[pos++] = 0x04;//长度
packet[pos++] = 0x00;//SNMP request ID
packet[pos++] = 0x00;
packet[pos++] = 0x00;
packet[pos++] = 0x01;
//错误状态
packet[pos++] = 0x02;//整数类型
packet[pos++] = 0x01;//长度
packet[pos++] = 0x00;//SNMP错误类型
//错误索引
packet[pos++] = 0x02;//整数类型
packet[pos++] = 0x01;//长度
packet[pos++] = 0x00;//SNMP错误索引
//不同系统对象名开始
packet[pos++] = 0x30;//不同对象序列开始标志
packet[pos++] = Convert.ToByte(6 + miblen - 1);//不同对象的长度
packet[pos++] = 0x30;//对象序列的开始
packet[pos++] = Convert.ToByte(6 + miblen - 1 - 2);//尺寸
packet[pos++] = 0x06;//对象类型
packet[pos++] = Convert.ToByte(miblen - 1);//长度
//mib开始
packet[pos++] = 0x2b;
//把MIB数字放入包中
for (i = 2; i < miblen; i++)
{
packet[pos++] = Convert.ToByte(mib[i]);
}
packet[pos++] = 0x05;//空对象值
packet[pos++] = 0x00;//空
//把包送到目标
DataHex[ic] = "GetRequest:\r\n";
DataHex[ic] += BitConverter.ToString(packet, 0, packet[1] + 2) + "\r\n";
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;
//Console.Write(ihe.AddressList[0]);
sock.SendTo(packet, snmplen, SocketFlags.None, iep);
//从包中接受返回数据
try
{
int recv = sock.ReceiveFrom(packet, ref ep);
}
catch (SocketException)
{
packet[0] = 0xff;
}
//把包送到目标
DataHex[ic] += "GetResponse:\r\n";
DataHex[ic] += BitConverter.ToString(packet, 0, packet[1] + 2) + "\r\n";
ic++;
return packet;
}
#endregion
#region set
private void SetInfo()
{
toolStripProgressBar1.Value = 0;
string hostIP = textBox1.Text;
string comm = textBox9.Text;
toolStripProgressBar1.Value++;
toolStripProgressBar1.Value++;
toolStripProgressBar1.Value++;
setlable("正在SET sysContact...");
response = setRequest(textBox8.Text, hostIP, comm, sysContact);
toolStripProgressBar1.Value++;
setlable("正在SET sysName...");
response = setRequest(textBox7.Text, hostIP, comm, sysName);
toolStripProgressBar1.Value++;
setlable("正在SET syslocation...");
response = setRequest(textBox6.Text, hostIP, comm, syslocation);
toolStripProgressBar1.Value++;
setlable("全部SET结束...");
toolStripProgressBar1.Value++;
if (toolStripProgressBar1.Value > 7)
{
toolStripProgressBar1.Value = 0;
}
}
public byte[] setRequest(string value, string host, string community, string mibstring) //构造SetRequest报文段
{
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;
int vallen = value.Length;
//将mib字符串格式转换为整数格式,如果整数的值大于128需要多个字节,同时也应该增加mib库的长度
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 + vallen - 1;
//snmp 包序列开始
packet[pos++] = 0x30;//包开始
packet[pos++] = Convert.ToByte(snmplen - 2);
//snmp 版本号
packet[pos++] = 0x02;//整数类型
packet[pos++] = 0x01;//长度
packet[pos++] = 0x00;//snmp 版本1
//团体名称
packet[pos++] = 0x04;//字符类型
packet[pos++] = Convert.ToByte(comlen);//团体名称长度
//转化团体名称到字符序列中
byte[] data = Encoding.ASCII.GetBytes(community);
for (i = 0; i < data.Length; i++)
{
packet[pos++] = data[i];
}
//添加SetRequest 值
packet[pos++] = 0xA3;
packet[pos++] = Convert.ToByte(20 + miblen + vallen - 1);//mib的总长度
//Request ID
packet[pos++] = 0x02;//整数类型
packet[pos++] = 0x04;//长度
packet[pos++] = 0x00;//SNMP request ID
packet[pos++] = 0x00;
packet[pos++] = 0x00;
packet[pos++] = 0x02;
//错误状态
packet[pos++] = 0x02;//整数类型
packet[pos++] = 0x01;//长度
packet[pos++] = 0x00;//SNMP错误类型
//错误索引
packet[pos++] = 0x02;//整数类型
packet[pos++] = 0x01;//长度
packet[pos++] = 0x00;//SNMP错误索引
//不同系统对象名开始
packet[pos++] = 0x30;//不同对象序列开始标志
packet[pos++] = Convert.ToByte(6 + miblen + vallen - 1);//不同对象的长度
packet[pos++] = 0x30;//对象序列的开始
packet[pos++] = Convert.ToByte(6 + miblen + vallen - 1 - 2);//尺寸
packet[pos++] = 0x06;//对象类型
packet[pos++] = Convert.ToByte(miblen - 1);//长度
//mib开始
packet[pos++] = 0x2b;
//把MIB数字放入包中
for (i = 2; i < miblen; i++)
{
packet[pos++] = Convert.ToByte(mib[i]);
}
packet[pos++] = 0x04;//变量类型
packet[pos++] = Convert.ToByte(vallen); //变量长度
//变量开始
byte[] data1 = Encoding.ASCII.GetBytes(value);
for (i = 0; i < data1.Length; i++)
{
packet[pos++] = data1[i];
}
//把包送到目标
if (ic >= 7)
{
ic = 0;
}
DataHex[ic] = "SetRequest:\r\n";
DataHex[ic] += BitConverter.ToString(packet, 0, packet[1] + 2) + "\r\n";
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;
//Console.Write(ihe.AddressList[0]);
sock.SendTo(packet, snmplen, SocketFlags.None, iep);
//从包中接受返回数据
try
{
int recv = sock.ReceiveFrom(packet, ref ep);
}
catch (SocketException)
{
packet[0] = 0xff;
}
//把包送到目标
DataHex[ic] += "SetResponse:\r\n";
DataHex[ic] += BitConverter.ToString(packet, 0, packet[1] + 2) + "\r\n";
ic++;
return packet;
}
#endregion
#region 显示报文
private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
if (DataHex != null)
{
try
{
textBox10.Text = DataHex[listBox1.SelectedIndex].ToString();
}
catch
{
textBox10.Text = "显示包时出错或无数据包";
}
}
}
#endregion
}
}