1.MIB 管理信息库
2.通过SNMP(简单网管协议)来管理网络设备的状态、网络流量等
SNMP是一系列协议组和规范,它们提供了一种从网络上的设备中收集网络管理信息的方法
当然支持SNMP的设备才能进行管理
使用(SNMPV1-V3)接口进行编程
3.V1的5个请求/响应原语:
get-request
set-request
get-next-request
get-reponse
trap
4.我有WINDOWS下的库,但无源代码
2.通过SNMP(简单网管协议)来管理网络设备的状态、网络流量等
SNMP是一系列协议组和规范,它们提供了一种从网络上的设备中收集网络管理信息的方法
当然支持SNMP的设备才能进行管理
使用(SNMPV1-V3)接口进行编程
3.V1的5个请求/响应原语:
get-request
set-request
get-next-request
get-reponse
trap
4.我有WINDOWS下的库,但无源代码
我是第一次接触这些,您能否说明一下怎样来调用MIB 来进行编程
例如用VB ,VC等
那有下载的,请告诉我
管理对象表示成字符串".1.4.2.7.3.11.2.1.16"
我有一些相关原代码,unix c.
要吗
{
}CSnmpMan::CSnmpMan(char* community,char* variable,int command)
{
for (int i=0;i<32;i++)
this->community[i]=community[i];
for (i=0;i<VAR_LEN;i++)
this->variable [i]=variable[i];
this->command=command;
}
CSnmpMan::~CSnmpMan()
{
}
BEGIN_MESSAGE_MAP(CSnmpMan, CWnd)
//{{AFX_MSG_MAP(CSnmpMan)
// NOTE - the ClassWizard will add and remove mapping macros here.
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CSnmpMan message handlersvoid CSnmpMan::ASNCode()
{
int counter;
u_char *cp,*com,*count;
int lab=1;
u_char *pointer;
int i; for(i=0;i<MAX_LEN;i++)
packet[i]='\0';
pointer=packet;
cp=packet;
*cp++=(u_char)0x30;
cp++; // totallength
*cp++=(u_char)0x02;
*cp++=(u_char)0x01;
*cp++=(u_char)0x00;
// AfxMessageBox((LPCTSTR)packet);
com=(u_char *)community;
*cp++=(u_char)0x04;
*cp++=(u_char)strlen((char *)com);
strcpy((char *)cp,(char *)com);
cp+=strlen((char *)com); if (command==SNMP_GET)
*cp++=(u_char)0xa0; // get command
else
if (command==SNMP_GETNEXT)
*cp++=(u_char)0xa1;// get-next command
cp++;
*cp++=(u_char)0x02;
*cp++=(u_char)0x04;
for(i=0;i<4;i++)
*cp++=(u_char)0x00;
for(i=0;i<2;i++) {
*cp++=(u_char)0x02;
*cp++=(u_char)0x01;
*cp++=(u_char)0x00;
}
*cp++=(u_char)0x30;
cp++;//len
*cp++=(u_char)0x30;
cp++;//len
*cp++=(u_char)0x06; com=(u_char *)variable;
com+=3;
counter=0;
count=(u_char *)variable;
while(*count!=0) {
if(*count=='.') counter++;
count++;
}
*cp++=counter;
*cp++=(u_char)0x2b; while(*com!=0){
if(*com!='.')
if(*(com+1)!='.'&&*(com+1)!=0){
if(*(com+2)!='.'&&*(com+2)!=0) {
*cp++=(u_char)((*com-48)*100+(*(com+1)-48)*10+(*(com+2))-48);
com+=3;
}
else{
*cp++=(u_char)((*com-48)*10+(*(com+1))-48);
com+=2;
}
}
else *cp++=(u_char)*com++-48;
else com++;
} *cp++=(u_char)0x05;
*cp++=(u_char)0x00;
pointer+=lab;
*pointer=(u_char)(cp-packet-2);
pointer+=5;
pointer+=*pointer;
pointer+=2;
*pointer=packet[1]-(pointer-packet-1);
pointer+=14;
*pointer=packet[1]-(pointer-packet-1);
pointer+=2;
*pointer=packet[1]-(pointer-packet-1);
packet[100]='1';///for debug
// TRACE("%s",packet);}void CSnmpMan::ASNDecode()
{
int pos=0; int len;
unsigned int rLen;
unsigned long int packetlen;
u_char *pac,*tmp; pac=packet;
pac++;//忽略第一字节,第二字节为记录对象长度
//////////判断是否为短格式即长度八位组为0xxxxxxx的格式
if((*pac&0x80)!=0) {//非短格式,处理
len=*pac-0x80; pac++;
packetlen=*pac++;
len--;
while(len!=0){
packetlen<<=8;
packetlen+=*pac++;
len--;
}
}
else packetlen=*pac;//短格式,记录对象长度 pac=packet; //从包头开始剥去信息包外壳
pac++; // 略过第一字节
if(*pac>0x80) pac+=*pac-0x80+1;
else pac++; //略过包长度字节(可能为多字节)
pac++;
pac+=*pac+1; // 略过版本信息,长度+1
pac++;
pac+=*pac+1; // 略过共同体信息,长度+1
pac++;
if(*pac>0x80) pac+=*pac-0x80+1;
else pac++; // ?
pac++;
pac+=*pac+1; // 略过request id
pac++;
pac+=*pac; // 错误状态码
switch(*pac){
case 0:
break;
case 1: AfxMessageBox("pdu size too big!");
return;
case 2: AfxMessageBox("no such name!");
return;
case 3: AfxMessageBox("bad value!");
return;
case 4: AfxMessageBox("this item is readonly!");
return;
case 5: AfxMessageBox("generate error!");
return;
default: break;
}
pac++;
pac++; //
pac+=*pac+1; //
pac++; //
if(*pac>0x80) //
pac+=*pac-0x80+1;
else
pac++;
pac++; //
if(*pac>0x80) //
pac+=*pac-0x80+1;
else
pac++;
pac++; //pac指向对象ID长度
if(command==SNMP_GETNEXT) {
int varlen,objlen,objcount;
for(objcount=0;objcount<128;objcount++)
variable[objcount]=0;
variable[0]='1';
variable[1]='.';
variable[2]='3';
variable[3]='.';
objlen= varlen =*pac-1;
pac++;
pac++;
objcount=4;///////////////////对于get-next分析返回的oid以便下次传输使用
while(objlen){
if(*pac<10)
variable[objcount++]=*pac+48;
else
if(*pac<100) {
variable[objcount++]=*pac/10+48;
variable[objcount++]=*pac%10+48;
}
else {
variable[objcount++]=*pac/100+48;
variable[objcount++]=(*pac%100)/10+48;
variable[objcount++]=(*pac%100)%10+48;
}
if(objlen!=1)
variable[objcount++]='.';
objlen--;
pac++;
}
}
else if (command==SNMP_GET)
{
pac+=*pac;
pac++;
}
tmp=pac;
tmp++;
if (*tmp>128)
{
int lByte;
int hByte;
int lenlen=(*tmp)&0x7f;
u_char* lbit;
lbit=++tmp;
if (*lbit>128)
{
hByte=1<<(lenlen*8);
lByte=*lbit&0x7f;
}
else
hByte=0; for (int c=1;c<lenlen;c++)
{
lByte+=lByte<<8;
lbit++;
lByte=*lbit;
}
rLen=lByte+hByte;
TRACE("%d\n",rLen);
tmp+=lenlen-1;
}
else
rLen=*tmp; //结果变量长度
tmp++;
GetVarType(pac);
switch(*pac) //*pac为变量类型
{
case ASN_SEQ:
break;
case ASN_OCTSTR:
ASN2str(tmp,rLen);
break;
case ASN_NULL:
ASN2null();
break;
case ASN_OBJID:
ASN2oid(pac,rLen);
break;
case ASN_IPADDR:
break;
case ASN_COUNTER32://可能大于四字节
ASN2int64(tmp,rLen);
break;
case ASN_INT: //四字节以内
case ASN_GAUGE:
ASN2int(tmp,rLen);
break;
case ASN_TIMETICKS:
ASN2time(tmp,rLen);
break;
}}void CSnmpMan::Init(char *community, char *variable, int command)
{
for (int i=0;i<32;i++)
this->community[i]=community[i];
for (i=0;i<VAR_LEN;i++)
this->variable [i]=variable[i];
this->command=command;
}void CSnmpMan::ASN2int(u_char *pack, int len)
{
int Low;
// __int64 counter;
u_char Hi;
int tlen;
char buf[128];
for (int i=0;i<256;i++)
result[i]='\0'; tlen=len;
Low=*pack&0x7f; //01111111 取出低字节
Hi=*pack&0x80 ; //10000000 取出高字节 for (tlen--,pack++;tlen>0;tlen --,pack++)
Low=(Low<<8)|(int)*pack;
// TRACE("%d,%d\n",Low,Hi);
if (Hi)
Low-=(1<<((len*8)-1));
bitResult=Low;
_itoa(bitResult,result,10);
TRACE("%s\n",result);
// packet[1000]='\0';
}void CSnmpMan::ASN2int64(u_char *pack, int len)
{
__int64 Low;
// __int64 counter;
u_char Hi;
int tlen;
char buf[128];
for (int i=0;i<256;i++)
result[i]='\0'; tlen=len;
Low=*pack&0x7f; //01111111 取出低字节
Hi=*pack&0x80 ; //10000000 取出高字节 for (tlen--,pack++;tlen>0;tlen --,pack++)
Low=(Low<<8)|(int)*pack;
// TRACE("%d,%d\n",Low,Hi);
if (Hi)
Low-=(1<<((len*8)-1));
counterResult=Low;
_i64toa(counterResult,result,10);
TRACE("%s\n",result);
}void CSnmpMan::ASN2str(u_char *pack, int len)
{
for (int i=0;i<256;i++)
result[i]='\0';
for (i=0;i<len;i++)
result[i]=*pack++;
if (result[0]=='\0')
ASN2null();
// TRACE("%s,%d\n",result,len);
// result[200]='a';
}void CSnmpMan::ASN2null()
{
result[0]='n';
result[1]='u';
result[2]='l';
result[3]='l';
result[4]='\0';}void CSnmpMan::GetVarType(u_char *pack)
{
switch(*pack) //*pac为变量类型
{
case ASN_SEQ:
varType="Sequence";
break;
case ASN_OCTSTR:
varType="OctetString";
break;
case ASN_NULL:
varType="Null";
break;
case ASN_OBJID:
varType="ObjectId";
break;
case ASN_IPADDR:
varType="IP Address";
break;
case ASN_COUNTER32:
varType="Counter32";
break;
case ASN_INT:
varType="Integer";
break;
case ASN_GAUGE:
varType="Gauge";
break;
case ASN_TIMETICKS:
varType="TimeTicks";
break;
}
}void CSnmpMan::ASN2oid(u_char *pack, int len)
{
int i=0;
result[i++]='1';
result[i++]='.';
result[i++]='3';
result[i++]='.';
pack++;
pack++;
pack++;
while(len)
{
if(*pack<10)
result[i++]=*pack+48;
else
if(*pack<100)
{
result[i++]=*pack/10+48;
result[i++]=*pack%10+48;
}
else
{
result[i++]=*pack/100+48;
result[i++]=(*pack%100)/10+48;
result[i++]=(*pack%100)%10+48;
}
if(len!=1)
result[i++]='.';
len--;
pack++;
}
result[i]='\0';
}void CSnmpMan::ASN2time(u_char *pack, int len)
{
int Low;
int day,hour,min,sec,msec;
char dayStr[4];
char hourStr[4];
char minStr[4];
char secStr[4];
char msecStr[4];
u_char Hi;
int tlen;
char buf[128];
for (int i=0;i<256;i++)
result[i]='\0'; for (i=0;i<4;i++)
{
dayStr[i]='\0';
hourStr[i]='\0';
minStr[i]='\0';
secStr[i]='\0';
msecStr[i]='\0';
}
tlen=len;
Low=*pack&0x7f; //01111111 取出低字节
Hi=*pack&0x80 ; //10000000 取出高字节 for (tlen--,pack++;tlen>0;tlen --,pack++)
Low=(Low<<8)|(int)*pack;
if (Hi)
Low-=(1<<((len*8)-1)); msec=Low%100;
Low=Low/100;
sec=Low%60;
Low=Low/60;
min=Low%60;
Low=Low/60;
hour=Low%60;
day=Low/60; _itoa(msec,msecStr,10);
_itoa(sec,secStr,10);
_itoa(min,minStr,10);
_itoa(hour,hourStr,10);
_itoa(day,dayStr,10); strcat(result,dayStr);
strcat(result," 天 ");
strcat(result,hourStr);
strcat(result," 小时 ");
strcat(result,minStr);
strcat(result," 分钟 ");
strcat(result,secStr);
strcat(result," 秒 ");
strcat(result,msecStr);
strcat(result," 毫秒 "); TRACE("%s\n",result);
}
//#include "stdafx.h"
#include "NetMan.h"
#include "SnmpMan.h"
#include "snmpasn.h"#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CSnmpManCSnmpMan::CSnmpMan()
{
}CSnmpMan::CSnmpMan(char* community,char* variable,int command)
{
for (int i=0;i<32;i++)
this->community[i]=community[i];
for (i=0;i<VAR_LEN;i++)
this->variable [i]=variable[i];
this->command=command;
}
CSnmpMan::~CSnmpMan()
{
}
BEGIN_MESSAGE_MAP(CSnmpMan, CWnd)
//{{AFX_MSG_MAP(CSnmpMan)
// NOTE - the ClassWizard will add and remove mapping macros here.
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CSnmpMan message handlersvoid CSnmpMan::ASNCode()
{
int counter;
u_char *cp,*com,*count;
int lab=1;
u_char *pointer;
int i; for(i=0;i<MAX_LEN;i++)
packet[i]='\0';
pointer=packet;
cp=packet;
*cp++=(u_char)0x30;
cp++; // totallength
*cp++=(u_char)0x02;
*cp++=(u_char)0x01;
*cp++=(u_char)0x00;
// AfxMessageBox((LPCTSTR)packet);
com=(u_char *)community;
*cp++=(u_char)0x04;
*cp++=(u_char)strlen((char *)com);
strcpy((char *)cp,(char *)com);
cp+=strlen((char *)com); if (command==SNMP_GET)
*cp++=(u_char)0xa0; // get command
else
if (command==SNMP_GETNEXT)
*cp++=(u_char)0xa1;// get-next command
cp++;
*cp++=(u_char)0x02;
*cp++=(u_char)0x04;
for(i=0;i<4;i++)
*cp++=(u_char)0x00;
for(i=0;i<2;i++) {
*cp++=(u_char)0x02;
*cp++=(u_char)0x01;
*cp++=(u_char)0x00;
}
*cp++=(u_char)0x30;
cp++;//len
*cp++=(u_char)0x30;
cp++;//len
*cp++=(u_char)0x06; com=(u_char *)variable;
com+=3;
counter=0;
count=(u_char *)variable;
while(*count!=0) {
if(*count=='.') counter++;
count++;
}
*cp++=counter;
*cp++=(u_char)0x2b; while(*com!=0){
if(*com!='.')
if(*(com+1)!='.'&&*(com+1)!=0){
if(*(com+2)!='.'&&*(com+2)!=0) {
*cp++=(u_char)((*com-48)*100+(*(com+1)-48)*10+(*(com+2))-48);
com+=3;
}
else{
*cp++=(u_char)((*com-48)*10+(*(com+1))-48);
com+=2;
}
}
else *cp++=(u_char)*com++-48;
else com++;
} *cp++=(u_char)0x05;
*cp++=(u_char)0x00;
pointer+=lab;
*pointer=(u_char)(cp-packet-2);
pointer+=5;
pointer+=*pointer;
pointer+=2;
*pointer=packet[1]-(pointer-packet-1);
pointer+=14;
*pointer=packet[1]-(pointer-packet-1);
pointer+=2;
*pointer=packet[1]-(pointer-packet-1);
packet[100]='1';///for debug
// TRACE("%s",packet);}void CSnmpMan::ASNDecode()
{
int pos=0; int len;
unsigned int rLen;
unsigned long int packetlen;
u_char *pac,*tmp; pac=packet;
pac++;//忽略第一字节,第二字节为记录对象长度
//////////判断是否为短格式即长度八位组为0xxxxxxx的格式
if((*pac&0x80)!=0) {//非短格式,处理
len=*pac-0x80; pac++;
packetlen=*pac++;
len--;
while(len!=0){
packetlen<<=8;
packetlen+=*pac++;
len--;
}
}
else packetlen=*pac;//短格式,记录对象长度 pac=packet; //从包头开始剥去信息包外壳
pac++; // 略过第一字节
if(*pac>0x80) pac+=*pac-0x80+1;
else pac++; //略过包长度字节(可能为多字节)
pac++;
pac+=*pac+1; // 略过版本信息,长度+1
pac++;
pac+=*pac+1; // 略过共同体信息,长度+1
pac++;
if(*pac>0x80) pac+=*pac-0x80+1;
else pac++; // ?
pac++;
pac+=*pac+1; // 略过request id
pac++;
pac+=*pac; // 错误状态码
switch(*pac){
case 0:
break;
case 1: AfxMessageBox("pdu size too big!");
return;
case 2: AfxMessageBox("no such name!");
return;
case 3: AfxMessageBox("bad value!");
return;
case 4: AfxMessageBox("this item is readonly!");
return;
case 5: AfxMessageBox("generate error!");
return;
default: break;
}
pac++;
pac++; //
pac+=*pac+1; //
pac++; //
if(*pac>0x80) //
pac+=*pac-0x80+1;
else
pac++;
pac++; //
if(*pac>0x80) //
pac+=*pac-0x80+1;
else
pac++;
pac++; //pac指向对象ID长度
if(command==SNMP_GETNEXT) {
int varlen,objlen,objcount;
for(objcount=0;objcount<128;objcount++)
variable[objcount]=0;
variable[0]='1';
variable[1]='.';
variable[2]='3';
variable[3]='.';
objlen= varlen =*pac-1;
pac++;
pac++;
objcount=4;///////////////////对于get-next分析返回的oid以便下次传输使用
while(objlen){
if(*pac<10)
variable[objcount++]=*pac+48;
else
if(*pac<100) {
variable[objcount++]=*pac/10+48;
variable[objcount++]=*pac%10+48;
}
else {
variable[objcount++]=*pac/100+48;
variable[objcount++]=(*pac%100)/10+48;
variable[objcount++]=(*pac%100)%10+48;
}
if(objlen!=1)
variable[objcount++]='.';
objlen--;
pac++;
}
}
else if (command==SNMP_GET)
{
pac+=*pac;
pac++;
}
tmp=pac;
tmp++;
if (*tmp>128)
{
int lByte;
int hByte;
int lenlen=(*tmp)&0x7f;
u_char* lbit;
lbit=++tmp;
if (*lbit>128)
{
hByte=1<<(lenlen*8);
lByte=*lbit&0x7f;
}
else
hByte=0; for (int c=1;c<lenlen;c++)
{
lByte+=lByte<<8;
lbit++;
lByte=*lbit;
}
rLen=lByte+hByte;
TRACE("%d\n",rLen);
tmp+=lenlen-1;
}
else
rLen=*tmp; //结果变量长度
tmp++;
GetVarType(pac);
switch(*pac) //*pac为变量类型
{
case ASN_SEQ:
break;
case ASN_OCTSTR:
ASN2str(tmp,rLen);
break;
case ASN_NULL:
ASN2null();
break;
case ASN_OBJID:
ASN2oid(pac,rLen);
break;
case ASN_IPADDR:
break;
case ASN_COUNTER32://可能大于四字节
ASN2int64(tmp,rLen);
break;
case ASN_INT: //四字节以内
case ASN_GAUGE:
ASN2int(tmp,rLen);
break;
case ASN_TIMETICKS:
ASN2time(tmp,rLen);
break;
}}void CSnmpMan::Init(char *community, char *variable, int command)
{
for (int i=0;i<32;i++)
this->community[i]=community[i];
for (i=0;i<VAR_LEN;i++)
this->variable [i]=variable[i];
this->command=command;
}void CSnmpMan::ASN2int(u_char *pack, int len)
{
int Low;
// __int64 counter;
u_char Hi;
int tlen;
char buf[128];
for (int i=0;i<256;i++)
result[i]='\0'; tlen=len;
Low=*pack&0x7f; //01111111 取出低字节
Hi=*pack&0x80 ; //10000000 取出高字节 for (tlen--,pack++;tlen>0;tlen --,pack++)
Low=(Low<<8)|(int)*pack;
// TRACE("%d,%d\n",Low,Hi);
if (Hi)
Low-=(1<<((len*8)-1));
bitResult=Low;
_itoa(bitResult,result,10);
TRACE("%s\n",result);
// packet[1000]='\0';
}void CSnmpMan::ASN2int64(u_char *pack, int len)
{
__int64 Low;
// __int64 counter;
u_char Hi;
int tlen;
char buf[128];
for (int i=0;i<256;i++)
result[i]='\0'; tlen=len;
Low=*pack&0x7f; //01111111 取出低字节
Hi=*pack&0x80 ; //10000000 取出高字节 for (tlen--,pack++;tlen>0;tlen --,pack++)
Low=(Low<<8)|(int)*pack;
// TRACE("%d,%d\n",Low,Hi);
if (Hi)
Low-=(1<<((len*8)-1));
counterResult=Low;
_i64toa(counterResult,result,10);
TRACE("%s\n",result);
}void CSnmpMan::ASN2str(u_char *pack, int len)
{
for (int i=0;i<256;i++)
result[i]='\0';
for (i=0;i<len;i++)
result[i]=*pack++;
if (result[0]=='\0')
ASN2null();
// TRACE("%s,%d\n",result,len);
// result[200]='a';
}void CSnmpMan::ASN2null()
{
result[0]='n';
result[1]='u';
result[2]='l';
result[3]='l';
result[4]='\0';}void CSnmpMan::GetVarType(u_char *pack)
{
switch(*pack) //*pac为变量类型
{
case ASN_SEQ:
varType="Sequence";
break;
case ASN_OCTSTR:
varType="OctetString";
break;
case ASN_NULL:
varType="Null";
break;
case ASN_OBJID:
varType="ObjectId";
break;
case ASN_IPADDR:
varType="IP Address";
break;
case ASN_COUNTER32:
varType="Counter32";
break;
case ASN_INT:
varType="Integer";
break;
case ASN_GAUGE:
varType="Gauge";
break;
case ASN_TIMETICKS:
varType="TimeTicks";
break;
}
}void CSnmpMan::ASN2oid(u_char *pack, int len)
{
int i=0;
result[i++]='1';
result[i++]='.';
result[i++]='3';
result[i++]='.';
pack++;
pack++;
pack++;
while(len)
{
if(*pack<10)
result[i++]=*pack+48;
else
if(*pack<100)
{
result[i++]=*pack/10+48;
result[i++]=*pack%10+48;
}
else
{
result[i++]=*pack/100+48;
result[i++]=(*pack%100)/10+48;
result[i++]=(*pack%100)%10+48;
}
if(len!=1)
result[i++]='.';
len--;
pack++;
}
result[i]='\0';
}void CSnmpMan::ASN2time(u_char *pack, int len)
{
int Low;
int day,hour,min,sec,msec;
char dayStr[4];
char hourStr[4];
char minStr[4];
char secStr[4];
char msecStr[4];
u_char Hi;
int tlen;
char buf[128];
for (int i=0;i<256;i++)
result[i]='\0'; for (i=0;i<4;i++)
{
dayStr[i]='\0';
hourStr[i]='\0';
minStr[i]='\0';
secStr[i]='\0';
msecStr[i]='\0';
}
tlen=len;
Low=*pack&0x7f; //01111111 取出低字节
Hi=*pack&0x80 ; //10000000 取出高字节 for (tlen--,pack++;tlen>0;tlen --,pack++)
Low=(Low<<8)|(int)*pack;
if (Hi)
Low-=(1<<((len*8)-1)); msec=Low%100;
Low=Low/100;
sec=Low%60;
Low=Low/60;
min=Low%60;
Low=Low/60;
hour=Low%60;
day=Low/60; _itoa(msec,msecStr,10);
_itoa(sec,secStr,10);
_itoa(min,minStr,10);
_itoa(hour,hourStr,10);
_itoa(day,dayStr,10); strcat(result,dayStr);
strcat(result," 天 ");
strcat(result,hourStr);
strcat(result," 小时 ");
strcat(result,minStr);
strcat(result," 分钟 ");
strcat(result,secStr);
strcat(result," 秒 ");
strcat(result,msecStr);
strcat(result," 毫秒 "); TRACE("%s\n",result);
}
http://www.fock.de/agent++/在snmp网管协约中有两侧:Manager侧和Agent侧。其中Agent侧是指被管对象的代理,比如交换机等设备上的网管;
Manager侧是指网管工作站,可以编程实现snmp协约对被管设备
进行管理,可以选用HP提供的snmp++软件包,免费并且提供源代码,
而且是for VC++.你所说的编程主要指的是Manager侧的编程,snmp++足够了。另外,你还必须知道被管设备的MIB库结构及内容!!!chat* luck true