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 
 
 
    } 
}