📄 form1.cs
字号:
//弹出消息框并报错 然后返回false值
MessageBox.Show("主机地址和团体名不能为空!");
return false;
}
else
//若输入信息不为空 返回true值
return true;
}
}
class SNMP
{
public SNMP()
{
}
public byte[] getMessage(string request, string hostString, string community, string mibStr)
{
//初始化发送的SNMP包数组
byte[] sendPacket = new byte[1024];
//初始化返回的SNMP包数组
byte[] returnPacket = new byte[1024];
//初始化存放MIB对象的数组
byte[] mib = new byte[1024];
//将mib字符串数组用"."分隔开 并存入mibvalue字符串数组
string[] mibvalue = mibStr.Split('.');
//获得mibvalue字符串的长度 作为mib消息的长度
int miblength = mibvalue.Length;
//当前的mib长度
int orgmiblength = miblength;
//获得团体名长度
int comlength = community.Length;
int current = 0, ps = 0, temp, i;
//初始化SNMP包的长度
int snmplength;
//这段for循环 将mib字符串数组转换为byte类型 存入mib byte数组中
for (i = 0; i < orgmiblength; i++)
{
//首先将字符串转换为16位Int型
temp = Convert.ToInt16(mibvalue[i]);
if (temp > 127)
{
//若mib中对象的标识符大于128 则将其高位存在前面的数组中
mib[current] = Convert.ToByte(128+(temp / 128));
mib[current + 1] = Convert.ToByte(temp - ((temp / 128) * 128));
//由于数字占了两位 下标加2
current = current + 2;
//mib长度只加1
miblength++;
}
else
{
//若标识符小于128则直接转化为byte类型存入
mib[current] = Convert.ToByte(temp);
current++;
}
}
//计算出SNMP包总长
snmplength = 29 + comlength + miblength - 1;
//开始填写SNMP包的版本
//16进制数0x30代表传输开始
sendPacket[ps++] = 0x30;
//填写SNMP包的长度 为SNMP包的总长度减去传输开始和长度这2位
sendPacket[ps++] = Convert.ToByte(snmplength - 2);
//填写SNMP版本
//0x02说明类型为整数型
sendPacket[ps++] = 0x02;
//0x01说明长度为1
sendPacket[ps++] = 0x01;
//0x00说明版本号为0
sendPacket[ps++] = 0x00;
//填写团体名
//0x04说明类型为字符串型
sendPacket[ps++] = 0x04;
//将团体长度转换为byte类型并填入数组
sendPacket[ps++] = Convert.ToByte(comlength);
//将团体名转化为byte类型存入snmpData数组中
byte[] snmpData = Encoding.ASCII.GetBytes(community);
for (i = 0; i < snmpData.Length; i++)
{
//将byte类型 存入SNMP包中
sendPacket[ps++] = snmpData[i];
}
//填写SNMP PDU
//设置SNMP的PDU类型 若PDU信息为get
//填入A0表示 Request 格式
if ("get"==request)
sendPacket[ps++] = 0xA0;
//填入A1表示 NextRequest 格式
else
sendPacket[ps++] = 0xA1;
//填入PDU的数据长度
sendPacket[ps++] = Convert.ToByte(20 + miblength - 1);
//填写PDU请求ID
//填写数据类型为整型
sendPacket[ps++] = 0x02;
//填写长度为4
sendPacket[ps++] = 0x04;
//填写请求ID
sendPacket[ps++] = 0x00;
sendPacket[ps++] = 0x00;
sendPacket[ps++] = 0x00;
sendPacket[ps++] = 0x01;
//填写错误状态信息
//填写整型类型
sendPacket[ps++] = 0x02;
//填写错误长度类型
sendPacket[ps++] = 0x01;
//填写错误状态类型
sendPacket[ps++] = 0x00;
//填写错误索引
//填写整型类型
sendPacket[ps++] = 0x02;
//填写长度类型
sendPacket[ps++] = 0x01;
//填写错误状态类型
sendPacket[ps++] = 0x00;
//开始绑定变量
//0x30说明变量绑定开始
sendPacket[ps++] = 0x30;
//填写变量长度
sendPacket[ps++] = Convert.ToByte(6 + miblength - 1);
//0x30开始填写第一个变量
sendPacket[ps++] = 0x30;
//填写变量长度
sendPacket[ps++] = Convert.ToByte(6 + miblength - 1 - 2);
//下面填写MIB类型
//说明变量类型为对象
sendPacket[ps++] = 0x06;
//填写对象类型
sendPacket[ps++] = Convert.ToByte(miblength - 1);
//MIB开始填写
//用0x2b代表MIB对象的标识符1.3
sendPacket[ps++] = 0x2B;
//填写mib对象
for (i = 2; i < miblength; i++)
//根据长度开始填写MIB对象
sendPacket[ps++] = Convert.ToByte(mib[i]);
//填写最后结束类型为空
sendPacket[ps++] = 0x05;
//填写长度为0
sendPacket[ps++] = 0x00;
//下面编写发送程序
//初始化Socket对象
Socket sendSock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
//设置Socket的超时时间为5秒
sendSock.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, 5000);
//使用传入的IP字符串来初始化为IPAddress 类型的IP地址
IPAddress hostip = IPAddress.Parse(hostString);
//从端口161发送信息
IPEndPoint iep = new IPEndPoint(hostip, 161);
EndPoint ep = (EndPoint)iep;
try
{
//开始发送套接字
sendSock.SendTo(sendPacket, snmplength, SocketFlags.None, iep);
}
catch (Exception e)
{
//若发送失败 弹出出错消息
MessageBox.Show("与服务器连接失败");
//把SNMP包的首字符改为 0xff 说明传送失败
returnPacket[0] = 0xff;
//传回SNMP包
return returnPacket;
}
//若发送成功
try
{
//接收返回消息
int recv = sendSock.ReceiveFrom(returnPacket, ref ep);
}
catch (SocketException)
{
//若接收失败 修改SNMP包首字符为0xff
returnPacket[0] = 0xff;
}
//返回收到的SNMP包
return returnPacket;
}
//将byte数组mibName转换为string类型
public string nextMIBMessage(byte[] mibName)
{
//字符串首字符为"1.3"
string outStr = "1.3";
int cmutyleng = mibName[6];
int start = 6 + cmutyleng + 17;
int mibleng = mibName[start] - 1;
//除去字符“1.3” 标志start加2
start += 2;
int mibVal;
//使用for循环来将byte类型的mib标识符转化为字符串类型
for (int i = start; i < start + mibleng; i++)
{
mibVal = Convert.ToInt16(mibName[i]);
//若欲转换字符大于128
if (mibVal > 128)
{
//则将高位先行放入字符串
mibVal = (mibVal / 128) * 128 + Convert.ToInt16(mibName[i + 1]);
i++;
}
//将每个字符加入MIB字符串outStr中
outStr += "." + mibVal;
}
//将转换好的MIB字符串作为返回值返回
return outStr;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -