⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 form1.cs

📁 visual c# 网络编程技术与实践实例包括几个源码
💻 CS
📖 第 1 页 / 共 2 页
字号:
                //弹出消息框并报错 然后返回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 + -