snmpc语言
㈠ C语言常用词汇及函数有那些
常用词汇:
1、short:修饰int,短整型数据,可省略被修饰的int。
2、long:修饰int,长整型数据,可省略被修饰的int。
3、long long:修饰int,超长整型数据,可省略被修饰的int。
4、signed:修饰整型数据,有符号数据类型。
5、unsigned:修饰整型数据,无符号数据类型。
6、restrict:用于限定和约束指针,并表明指针是访问一个数据对象的唯一且初始的方式。
7、return:用在函数体中,返回特定值(如果是void类型,则不返回函数值)。
8、continue:结束当前循环,开始下一轮循环。
9、break:跳出当前循环或switch结构。
10、goto:无条件跳转语句。
11、if:条件语句,后面不需要放分号。
12、else:条件语句否定分支(与if连用)。
13、switch:开关语句(多重分支语句)。
14、case:开关语句中的分支标记,与switch连用。
15、default:开关语句中的“其他”分支,可选。

常用函数:
1、int isalpha(int ch) 若ch是字母('A'-'Z','a'-'z'),返回非0值,否则返回0。
2、int isalnum(int ch) 若ch是字母('A'-'Z','a'-'z')或数字('0'-'9'),返回非0值,否则返回0。
3、int abs(int i) 返回整型参数i的绝对值。
4、double cabs(struct complex znum) 返回复数znum的绝对值。
5、double fabs(double x) 返回双精度参数x的绝对值。
6、long labs(long n) 返回长整型参数n的绝对值。
㈡ C语言结构体存储问题
你最好重写你的function1,因为你function1(sp, WORK,len,fd);	
这样调用函数时参数都是值传递,也就是相当于把sp中的参数值复制了一份给function1使用,函数执行完退出后,这些值的空间也就被释放了,所以sp中的值没有改变。你可以这样写:
typedefstruct//绑定变量
{
intoid_name[BUFFER_SIZE];//OID值
intoid_len;//OID长度
intvalue_type;//变量值的类型
intvalue_len;//变量值的长度
intoid_value;//变量值的值
}variable_list_t;
typedefstruct
{
intget_snmp[BUFFER_SIZE];
inttotal_length;
intversion;//版本号
intcommunity[BUFFER_SIZE];//团体关键字
intcommand;//PUD类型
intreqid[BUFFER_SIZE];//请求标识
interrstat;//错误状态
interrindex;//错误索引
intp_type_start;
interrorstatus_start;
interrorIndex_start;
intoid_value_start;
intvarbing_start;
variable_list_tval;
}SNMP_t;
voidmain(void){
SNMP_tsp;
function1(&sp,WORK,len,fd);
}
function1(SNMP_t*snmp,WorkTypework,intlen,intfd){
snmp->total_length=work.xxx;
...
}
不知道你能看懂这段代码吗?其实最核心的问题是你要想在函数退出后改变函数参数的值,就必须使用地址传递
㈢ 请问snmp协议实现的原理
看看《SNMP简单网络管理协议》李明江,有用的
㈣ snmp的交互方式有哪三类实现机制分别是怎样的
在snmp发展到V3版本后,把snmp的安全性提升到一个新高度,这同时也带来了实现上的复杂性。在02年,03年我都曾经想进一步的了解它的实现,但都没什么进展。
这次在实现Csnmp的过程中,又一次的接触到V3的底层实现机理。现把我们在实现Csnmp中的V3模块的时候,对V3的一些实现细节做一总结,希望能缩短一些朋友掌握SNMPV3的时间和难度。(本文针对的朋友是对snmpV3有个接触的,故对v3术语不做解释)
我们先把加密和HMAC部分先放一下,等我们先讲几个别的问题后,再来看加密和HMAC这部分的时候,就会非常清晰了。
现在先把读写控制权限这部分(VACM)做一分析。VACM这部分在Csnmp中实现的时候有如下三个Vector每个分别装如下一个类:SecuToGroupTableItem、VacmAccessTableItem、ViewTreeFamiTableItem它们分别代表VacmSecurityToGroupTable、VacmAccessTable、VacmViewTreeFamilyTable这三张V3协议中的表。这三张表是配合起来一起完成对读写Mib信息的权限控制的。 首先,用securityName和securityModel从SecuToGroupVector取出其对应的groupName, 其次用刚才取到的groupName加上SecurityModel、SecurityLevel以及是读、还是写操作这四个参数从VacmAccessVector取出其相应的viewName。最后一步是VACM的关键,通过刚才上一步取到的ViewName,再加上request OID进行如下权限判断:对于ViewNameVector中的每一条记录首先判断其ViewName是否和我们取出来的ViewName相同,相同的话,看request OID是否是以该条记录中的subtree为开头的,如果是的话,再判断该条记录的familyType是included(1)还是excluded(2),如果是“included(1)“的话则继续判断按同样的步骤判断下一条记录,直到没有符合ViewName相同的记录。如果是“excluded(2)”的话,则退出,并向Manager(管理端)发出AuthError的错误Response。
    也许上面的文档写的不怎么清楚,但请各位稍微仔细掠一下的,就会发现VACM这部分其实较为简单,因为在我们实现的过程中这一块真正核心的代码估计不超过100行。
下面我会花较大篇幅把各位关心的V3的加密和HMAC部分做一分析。首先讲解一下Key Localization也就是密钥的具体化,即该管理端下的每个Agent都有一个不同于其他Agent的Key。之所以要key Localization,这主要是V3协议考虑到一个管理端要管理多个Agent,如果管理端对每个Agent的密钥都要取记住的话,这将是非常不方便的,第二个原因是即使有一个Agent的key被attacker取到了,他也无法知道其他的Agent的key。在实现Key Localization的时候,为满足上面的一般都这么做:先用用户的password,通过(MD5)处理得到对应的User key0,然后把刚才的User key0+你要通讯的Agent的EngineID,再一次通过MD5处理,这就获得了你所需要的Localized Key。
这个Localized Key在接下来的加密和认证过程中都要用到(这是因为管理者可以只用一个password来产生加密的Key和认证的Key, 也就是加密的Key == 认证的key,但出于更好的安全性考虑的话,建议用两个不同的password来分别产生加密Key和认证Key)。
好,现在先就V3的Authentication的处理做一分析: 首先按SNMPV3 PDU的要求把所有部分都加上,但把USM部分中的msgAuthenticationParameters部分用连续的12个(byte)0x00填充。等所有部分都填充好后,用刚才讲到的认证Key+这个Request PDU一起,送入MD5,产生出一个12个byte的msgAuthenticationParameters,并用这个替换掉开始放入的12个空白byte,其实我们可以把msgAuthenticationParameters看作一个MAC它起到一个电子指纹的作用,这样一个V3版本的Request PDU就可以发给某一Agent了。
㈤ SNMP协议如何用C表示出基本元素
自己先顶一下,还有SNMP的状态机表示,真的弄不出来了,苦求!大侠帮忙,热心人士帮顶,谢了!
㈥ C#,SNMP,有知道怎么解析自定义的MIB文件的吗
想获得自定义mib中节点的信息,可以通过管理端也就是你所用的这个mib浏览器,向代理端发送查询信息,代理端返回节点信息,这样就获得了,至于在代理端怎么处理以及返回信息,可以用mib2c工具将自定义mib文件转换为.c文件(c#不懂。。)在.c文件中添加返回信息即可,有什么疑问可以追问
㈦ snmp代码前段求理解
package a服务器捕获的可视化效果;
import jpcap.*;
import jpcap.packet.*;
import java.awt.Rectangle;
import java.lang.String;
import javax.swing.*;
public class CapturePK extends JFrame implements PacketReceiver
{
private JPanel jContentPane = null;
private JButton start=null;
private JButton Stop=null;
private JButton End=null;
private JButton Analy=null;
private JTextArea jta = null;
private JScrollPane jsp=null;
private JScrollPane udpcon=null;
private JTextArea udpcontext=null;
public static Boolean begin=false;
public byte[] data=null;
public CapturePK()
{
    super();
    System.out.println("第一步");
    initialize();
   
}
private void initialize() 
{
    System.out.println("第二步");
    this.setSize(600, 500);
    this.setContentPane(getJContentPane());
    this.setTitle("Send服务器抓取信息");
    begin=false;
}
private JPanel getJContentPane()
{
    System.out.println("第三步");
    if (jContentPane == null) {
        jContentPane = new JPanel();
        jContentPane.setLayout(null);
        jContentPane.add(getStart(), null);//开始按钮
        jContentPane.add(getEnd(), null); //离开按钮
        jContentPane.add(getStop(), null);//停止anniu
        jContentPane.add(getAnaly(), null);
        jContentPane.add(getJScrollPane(),null);
        jContentPane.add(getJScrollPane1(),null);
    }   
    return jContentPane;
}
private JScrollPane getJScrollPane() {
    if (jsp == null) {
        jsp = new JScrollPane();
        jsp.setBounds(new Rectangle(20, 80, 500, 200));
        jsp.setViewportView(getJta());
    }
    return jsp;
}
private JScrollPane getJScrollPane1() {
    if (udpcon== null) {
        udpcon = new JScrollPane();
        udpcon.setBounds(new Rectangle(20, 300, 500, 150));
        udpcon.setViewportView(getJUDP());
    }
    return udpcon;
}
private JTextArea getJUDP() {
    if (udpcontext== null) {
        udpcontext= new JTextArea();
    }
    udpcontext.append("源Port \t"+"目的Port\t"+"Version\t"+"Community\t\t"+"Command\t"
                      +"ResquestId\t"+"Error_Status\t"+"Error_index\t"+"Oid\t\t"+"OidValue\r\n");
    return udpcontext;
}
private JTextArea getJta() {
    if (jta == null) {
        jta = new JTextArea();
    }
    jta.append("源IP\t\t"+"目的IP\t\t"+"Protocol\t"+"Version\n");
    return jta;
}
private JButton getStart() 
{
  if (start == null) {
        start = new JButton();
        start.setBounds(new Rectangle(10, 30, 80, 20));
        start.setText("Start");
        start.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent e) {
            Boolean b=true;
            setBeginValue(b);
            capture();
            }
        });
    }
    return start;
}
private JButton getEnd() 
{
    if (End == null) {
        End = new JButton();
        End.setBounds(new Rectangle(200, 30, 80, 20));
        End.setText("End");
        End.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent e) {
                System.exit(1);
            }
        });
    }
    return End;
}
private JButton getStop() 
{
    if (Stop == null) {
        Stop = new JButton();
        Stop.setBounds(new Rectangle(100, 30, 80, 20));
        Stop.setText("Stop");
        Stop.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent e) {
        Boolean b=false;
            setBeginValue(b);
            }
        });
    }
    return Stop;
}
public JButton getAnaly()
{
if(Analy==null)
    {
        Analy=new JButton();
        Analy.setBounds(new Rectangle(300,30,80,20));
        Analy.setText("Clear");
        Analy.addActionListener(new java.awt.event.ActionListener(){
            public void actionPerformed(java.awt.event.ActionEvent e){
                jta.setText("");
                jta.append("源IP\t\t"+"目的IP\t\t"+"Protocol\t"+"Version\n");
                udpcontext.setText("");            
                udpcontext.append("源Port \t"+"目的Port\t"+"Version\t"+"Community\t\t"+"Command\t"
                          +"ResquestId\t"+"Error_Status\t"+"Error_index\t"+"Oid\t\t"+"OidValue\r\n");
            }
        });
    }
    return Analy;
}
private void Analy(UDPPacket pk)
{  
    data=pk.data;
       String data1;
       String temp;
       int bits;
       int length;
       int len;
      data1=byteToString(data);
    
      String version;
      String Community;    
      String Command;
      String ResquestId;
      String Error_index;
      String Error_status;
      String Oid=null;
      String Oidvalue;
      //获取版本号
      System.out.println(data1);
      temp=data1.substring(2,4);
      bits=Judgebit(temp)*2+2;
      version=data1.substring(bits,bits+6);
      //获取Community
      bits=bits+6;
      Community=data1.substring(bits,bits+16);
      //get Command
      bits=bits+16;
      Command=data1.substring(bits,bits+2);
      //获取Command后面的数据(include itself)
      data1=data1.substring(bits);
      temp=data1.substring(2,4);//get the value behind command
      //获取requestid
      bits=Judgebit(temp)*2+2;
      int end=data1.indexOf("020100");
      ResquestId=data1.substring(bits,end);
      //获取Error_status
      Error_status=data1.substring(end,end+6);
      //获取Error_index
      Error_index=data1.substring(end+6,end+12);
      
      udpcontext.append(pk.src_port+"\t"+pk.dst_port+"\t"+version+"\t"
              +Community+"\t"+Command+"\t"+ResquestId+"\t"
                  +Error_status+"\t"+Error_index+"\t") ;  
      //data1只保留oid oidvalue 数据部分内容
      data1=data1.substring(end+12);
      //get the 结构类型后面的值
      temp=data1.substring(2,4);
      bits=Judgebit(temp);
      //获取从第一个oid开始的数据
      data1=data1.substring(2+bits*2);
      //get the length of oid and oidvalue
      String temp1 =data1.substring(2,4);
      //show the number of oid
      //length=Judge(temp);
      length=data1.length();
      len=(Judge(temp1)+2)*2;
      int number=length/len;
      //get the oid 
      for(int i=0;i<number;i++)
      {
          temp=data1.substring(6,8);
          length=Judge(temp);
          temp1=data1.substring(2,4);
          len=Judge(temp1);
          Oid=data1.substring(8,8+length*2);
          bits=8+length*2;
          int ends=(len+2)*2;
          Oidvalue=data1.substring(bits,ends );
          data1=data1.substring(ends);
          udpcontext.append(Oid+"\t"+Oidvalue+"\t");
      }
      udpcontext.append("\r\n");
}
private int Judgebit(String s)
{
    int bits=0;
    if(s.compareTo("80")<0)
    {
        bits=1;//长度只有两个字节
    }
    if(s.equals("81"))
    {
        bits=2;
    }
    if(s.equals("82"))
    {
        bits=3;
    }
    return bits;
}
private int Judge(String s)
{
    int temp=0;
    int high=0;
    int low=0;
    if(s.compareToIgnoreCase("0A")<0)
    {
        temp=Integer.parseInt(s);
    }
    else
    {
        String h=s.substring(0,1);
        String l=s.substring(1,2);
        high=change(h);
        low=change(l);
        temp=high*16+low;
    }
    return temp;
}
private int change(String s)//转化为十进制数
{
    int temp=0;
    if(s.compareToIgnoreCase("A")<0)
    {
        temp=Integer.parseInt(s);
    }
    else
    {
        if(s.equalsIgnoreCase("A"))
            temp=10;
        if(s.equalsIgnoreCase("B"))
            temp=11;
        if(s.equalsIgnoreCase("C"))
            temp=12;
        if(s.equalsIgnoreCase("D"))
            temp=13;
        if(s.equalsIgnoreCase("E"))
            temp=14;
        if(s.equalsIgnoreCase("F"))
            temp=15;
    }
    
    return temp;
}
private String byteToString(byte[] b)
{
    StringBuffer buf = new StringBuffer(); 
    for(int i=0;i<b.length;i++)
    {
            byte high, low; 
            byte maskHigh = (byte)0xf0; 
            byte maskLow = 0x0f; 
            high = (byte)((b[i] & maskHigh) >> 4); 
            low = (byte)(b[i] & maskLow); 
            buf.append(findHex(high)); 
            buf.append(findHex(low)); 
    }
    return buf.toString(); 
}
private static char findHex(byte b)
{ 
    int t = new Byte(b).intValue(); 
    t = t < 0 ? t + 16 : t; 
    if ((0 <= t) &&(t <= 9)) { 
    return (char)(t + '0'); 
    } 
    return (char)(t-10+'A'); 
    } 
private Boolean setBeginValue(Boolean b)
{
    begin=b;
    return  begin;
}
private Boolean getBeginValue()
{
    return begin;
}
public void receivePacket(Packet packet)    //实现接口PacketReceiver类中的receivePacket方法
    { 
        System.out.println("ok");
    }
public void capture()
     {
           Packet pa;
         try
         {
             NetworkInterface[] NI=JpcapCaptor.getDeviceList();               //获取设备列表名
             JpcapCaptor jpcap1= JpcapCaptor.openDevice(NI[1], 1000, true,50); // 打开网卡设备
             for(int i=0;i<200;i++)
             {
                 begin=getBeginValue();
                 if(begin)
               {
                     pa=jpcap1.getPacket();                        //获取数据包
                     if (pa instanceof IPPacket)                 //判断是否为IP数据包
                     {  
                          IPPacket ip=(IPPacket)pa;                       
                          jta.append(ip.src_ip+"\t\t"+ip.dst_ip+"\t\t"+ip.protocol+"\t"+ip.version);
                          jta.append("\r\n");
                          if(ip.protocol==17)
                          { 
                              UDPPacket udp=(UDPPacket)pa;
                              if(udp.src_port==161||udp.dst_port==162)
                              {
                                  Analy(udp);
                              }
                          }
                     }   
                }
                 else
                     break;
          }
         }
          catch (Exception e) 
          { 
              e.printStackTrace(); 
          }  
     }
public static void main(String[] args) 
    { //定义变量用存放数据包的相应的信息
     CapturePK cpk=new CapturePK();
     cpk.setVisible(true);      
    }
}
㈧ 有关snmp的get,getnext,getbulk操作的问题
关于snmp编程的资料其实很多。我建议你下载net-snmp开发包,看看里面的代码!他是用C语言编写的,编译后可以linux系统上测试。现成api是没有,不过你可以在这个开发包找到很多有用的函数。你可以重点看一下asn.c(有关ber编码文件)snmp_api.c(解析封装snmp包的)。你把这些文件好好整理一下,就可以得到自己的api,这就是最好的列子。
我自己动手写过snmp协议,实现get、getnext、set、snmptrap命令。代码不会很长,只有几千行。
如果有问题发邮件到[email protected]进行交流
㈨ 毕业设计 SNMP简单网络管理协议的设计与实现 要求 通过对关键设备流量等参数的实时采集给出网络运行状况
简单的就是到网络上下载一个网络管理系统,如思科的网络管理系统,惠普的网络管理平台都可以。然后安装到一个PC机上(权且叫它网络管理服务器),进行搜索网段配置就可以开始收集网络信息了。
如果要求复杂的就是基于SNMP的网络管理系统的开发,其实也没有多难,因为在网络是有很多开发包可以使用,JAVA及C语言的都有,你只要有一定的编程基础是不难的。
但是,难的是对协议的理解与运用。
