有那位高手知道snmp方面的编程?

infoman 2000-06-11 02:41:00
本人想计算交换机的每个端口的流量,想利用snmp读mib库中的数据。但是不知道用什么样的方法来实现?
...全文
286 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
moyixin 2000-07-22
  • 打赏
  • 举报
回复
you can using the snmp++,it is very userful.
about agent, nt platform or other? in nt, you may look the example in vc++
"snmp",in other platform, you may using some toolkit,such as usdsnmp,or
cmusnmp. my mail is chenwei_75@yahoo.com,we can dicusse other questions about snmp.
qife 2000-07-21
  • 打赏
  • 举报
回复
请问三位,如何做代理端程序,有做MIB的工具吗?
MK 2000-06-14
  • 打赏
  • 举报
回复
你的这个问题怎么和dolaime的那个一样呀,把我做的一个类给你们吧
如果还有需要的话请与我联系bo.geng@263.net
#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
/////////////////////////////////////////////////////////////////////////////
// CSnmpMan

CSnmpMan::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 handlers

void 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);
}
pbi 2000-06-13
  • 打赏
  • 举报
回复
电子工业出版社出版了一本这样的书,具体书名我忘了,封面是灰色的。
MSDN里也有相关资料:
MSDN/Platform SDK/Networking and Distributed Services/Simple Network Management Protocol

4,356

社区成员

发帖
与我相关
我的任务
社区描述
通信技术相关讨论
社区管理员
  • 网络通信
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧