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语言的都有,你只要有一定的编程基础是不难的。
但是,难的是对协议的理解与运用。