初次做snmp编程,高手救命!!
//发送pdu的函数如下,由void CFlowMonitorDlg::OnOK()函数调用,并返回一个回话句柄
HSNMP_SESSION snmpsend(HWND hwnd)
{
SNMPAPI_STATUS stat;
unsigned int wMsg;
HSNMP_SESSION hSession;
HSNMP_ENTITY hSrcEntity;
HSNMP_ENTITY hDstEntity;
smiOCTETS smiOctet;
HCONTEXT hSendContext;
smiOID sOid;
smiVALUE sValue;
HSNMP_VBL hVbl;
HSNMP_PDU hPdu;
LPCSTR SrcIp,DstIp;
SrcIp="192.168.0.4"; //管理站ip
DstIp="192.168.0.4"; //代理站ip
sValue.syntax=SNMP_SYNTAX_NULL;
sValue.value.uNumber=0;
smiOctet.len=strlen("public");
smiOctet.ptr=(unsigned char *)"public";
hSession=SnmpOpen(hwnd,wMsg);
if(hSession==SNMPAPI_FAILURE)
AfxMessageBox("初始化失败!",MB_OK);
SnmpSetTranslateMode(SNMPAPI_UNTRANSLATED_V2);
hSrcEntity=SnmpStrToEntity(hSession,SrcIp); //创建源实体
hDstEntity=SnmpStrToEntity(hSession,DstIp); //创建目标实体
if (hSrcEntity==SNMPAPI_FAILURE||hDstEntity==SNMPAPI_FAILURE)
AfxMessageBox("创建实体失败!");
//设置重传模式
stat=SnmpSetRetransmitMode(SNMPAPI_ON);
if(stat=SNMPAPI_FAILURE)
AfxMessageBox("设置重传模式失败!"); //设置代理超时时间
stat=SnmpSetTimeout(hDstEntity,100);
if(stat==SNMPAPI_FAILURE)
AfxMessageBox("设置代理站超时时间失败!");
//设置管理站超时时间
stat=SnmpSetTimeout(hSrcEntity,100);
if(stat==SNMPAPI_FAILURE)
AfxMessageBox("设置管理站超时时间失败!");
//设置管理站重传次数
stat=SnmpSetRetry(hSrcEntity,5);
if(stat==SNMPAPI_FAILURE)
AfxMessageBox("设置管理站重传次数失败!"); //设置代理重传次数
stat=SnmpSetRetry(hDstEntity,5);
if(stat==SNMPAPI_FAILURE)
AfxMessageBox("设置代理站重传次数失败!"); //创建上下文句柄
hSendContext=SnmpStrToContext(hSession,&smiOctet);
if(hSendContext==SNMPAPI_FAILURE)
AfxMessageBox("创建上下文句柄失败!");
//创建对象描述符
stat=SnmpStrToOid("1.3.6.1.2.1.2.2.1.10",&sOid);
if(stat==SNMPAPI_FAILURE)
AfxMessageBox("创建对象描述符失败!"); //创建变量捆绑列表
hVbl=SnmpCreateVbl(hSession,&sOid,NULL);
if(hVbl==SNMPAPI_FAILURE)
AfxMessageBox("创建变量绑定表失败!");
//创建pdu
hPdu=SnmpCreatePdu(hSession,SNMP_PDU_GET,0,NULL,NULL,hVbl);
if (hPdu==SNMPAPI_FAILURE)
AfxMessageBox("创建pdu失败!");
//追加变量绑定表
// stat=SnmpSetVb(hVbl,0,&sOid,&sValue);
// if(stat==SNMPAPI_FAILURE)
// AfxMessageBox("追加变量绑定表失败!"); //发送消息
stat=SnmpSendMsg(hSession,hSrcEntity,hDstEntity,hSendContext,hPdu);
if (stat!=SNMPAPI_SUCCESS)
AfxMessageBox("发送消息失败!"); SnmpFreeDescriptor(SNMP_SYNTAX_OID,(smiLPOPAQUE)&sOid);
SnmpFreeVbl(hVbl);
SnmpFreePdu(hPdu);
SnmpFreeEntity(hSrcEntity);
SnmpFreeEntity(hDstEntity);
SnmpFreeContext(hSendContext);
return hSession;
}//接受代理返回信息数据
void snmpReceive(HSNMP_SESSION hsession)
{
CString Re;
LONGLONG Val=0;
char cTmp[1024];
int i;
SNMPAPI_STATUS status;
HSNMP_PDU hPdu;
HSNMP_VBL hVbl;
HSNMP_ENTITY AgntEnt, MngEnt;
HSNMP_CONTEXT hRcvContext;
smiINT PduType, ErrorStatus, ErrorIndex;
smiINT32 nReqId;
smiVALUE sVal;
smiOID sOid;
status=SnmpRecvMsg(hsession,&AgntEnt,&MngEnt,&hRcvContext,&hPdu);
if(status!=SNMPAPI_SUCCESS)
AfxMessageBox("接收消息失败!");//(在这出错了!)
//获得错误信息
CString str;
str.Format("%d",SnmpGetLastError(hsession));
AfxMessageBox(str); //status=SnmpGetLastError(hsession);
// AfxMessageBox(Stat);
if (PduType==SNMP_PDU_RESPONSE)
{
status=SnmpGetVb(hVbl,1,&sOid,&sVal);
switch(sVal.syntax)
{
case SNMP_SYNTAX_INT32:
case SNMP_SYNTAX_UINT32:
case SNMP_SYNTAX_CNTR32:
case SNMP_SYNTAX_GAUGE32:
case SNMP_SYNTAX_TIMETICKS:
Val=sVal.value.sNumber;
break;
case SNMP_SYNTAX_CNTR64:
Val=sVal.value.hNumber.hipart<<32;
Val+=sVal.value.hNumber.lopart;
break;
case SNMP_SYNTAX_OCTETS:
case SNMP_SYNTAX_BITS:
case SNMP_SYNTAX_OPAQUE:
memset(cTmp,0,1024);
for(i=0;i<(int)sVal.value.string.len;i++)
cTmp[i]=sVal.value.string.ptr[i];
Re.Format("string:%s",cTmp);
break;
case SNMP_SYNTAX_IPADDR:
case SNMP_SYNTAX_NSAPADDR:
memset(cTmp, 0, 1024);
sprintf(cTmp, "%d.%d.%d.%d",
sVal.value.string.ptr[0],
sVal.value.string.ptr[1],
sVal.value.string.ptr[2],
sVal.value.string.ptr[3]);
Re.Format("String: %s",cTmp);
break;
case SNMP_SYNTAX_OID:
break;
default:
break;
}//end switch sVal.syntax
switch (nReqId) {
case 1: //1号请求是内存大小
Re.Format("MEM Size is %d", Val);
break;
case 2: //2号请求是系统描述
Re.Format("System Description is %d", Val);
break;
default:
break;
}//end switch nReqId
SnmpFreePdu(hPdu);
SnmpFreeVbl(hVbl);
SnmpFreeEntity(AgntEnt);
SnmpFreeEntity(MngEnt);
SnmpFreeContext(hRcvContext);
}
}void CFlowMonitorDlg::OnOK()
{
// TODO: Add extra validation here
HSNMP_SESSION hsession; //会话句柄
//CDialog::OnOK(); //发送pdu
hsession=snmpsend(this->m_hWnd); //接收消息
snmpReceive(hsession);
}
//发送pdu的函数如下,由void CFlowMonitorDlg::OnOK()函数调用,并返回一个回话句柄
HSNMP_SESSION snmpsend(HWND hwnd)
{
SNMPAPI_STATUS stat;
unsigned int wMsg;
HSNMP_SESSION hSession;
HSNMP_ENTITY hSrcEntity;
HSNMP_ENTITY hDstEntity;
smiOCTETS smiOctet;
HCONTEXT hSendContext;
smiOID sOid;
smiVALUE sValue;
HSNMP_VBL hVbl;
HSNMP_PDU hPdu;
LPCSTR SrcIp,DstIp;
SrcIp="192.168.0.4"; //管理站ip
DstIp="192.168.0.4"; //代理站ip
sValue.syntax=SNMP_SYNTAX_NULL;
sValue.value.uNumber=0;
smiOctet.len=strlen("public");
smiOctet.ptr=(unsigned char *)"public";
hSession=SnmpOpen(hwnd,wMsg);
if(hSession==SNMPAPI_FAILURE)
AfxMessageBox("初始化失败!",MB_OK);
SnmpSetTranslateMode(SNMPAPI_UNTRANSLATED_V2);
hSrcEntity=SnmpStrToEntity(hSession,SrcIp); //创建源实体
hDstEntity=SnmpStrToEntity(hSession,DstIp); //创建目标实体
if (hSrcEntity==SNMPAPI_FAILURE||hDstEntity==SNMPAPI_FAILURE)
AfxMessageBox("创建实体失败!");
//设置重传模式
stat=SnmpSetRetransmitMode(SNMPAPI_ON);
if(stat=SNMPAPI_FAILURE)
AfxMessageBox("设置重传模式失败!"); //设置代理超时时间
stat=SnmpSetTimeout(hDstEntity,100);
if(stat==SNMPAPI_FAILURE)
AfxMessageBox("设置代理站超时时间失败!");
//设置管理站超时时间
stat=SnmpSetTimeout(hSrcEntity,100);
if(stat==SNMPAPI_FAILURE)
AfxMessageBox("设置管理站超时时间失败!");
//设置管理站重传次数
stat=SnmpSetRetry(hSrcEntity,5);
if(stat==SNMPAPI_FAILURE)
AfxMessageBox("设置管理站重传次数失败!"); //设置代理重传次数
stat=SnmpSetRetry(hDstEntity,5);
if(stat==SNMPAPI_FAILURE)
AfxMessageBox("设置代理站重传次数失败!"); //创建上下文句柄
hSendContext=SnmpStrToContext(hSession,&smiOctet);
if(hSendContext==SNMPAPI_FAILURE)
AfxMessageBox("创建上下文句柄失败!");
//创建对象描述符
stat=SnmpStrToOid("1.3.6.1.2.1.2.2.1.10",&sOid);
if(stat==SNMPAPI_FAILURE)
AfxMessageBox("创建对象描述符失败!"); //创建变量捆绑列表
hVbl=SnmpCreateVbl(hSession,&sOid,NULL);
if(hVbl==SNMPAPI_FAILURE)
AfxMessageBox("创建变量绑定表失败!");
//创建pdu
hPdu=SnmpCreatePdu(hSession,SNMP_PDU_GET,0,NULL,NULL,hVbl);
if (hPdu==SNMPAPI_FAILURE)
AfxMessageBox("创建pdu失败!");
//追加变量绑定表
// stat=SnmpSetVb(hVbl,0,&sOid,&sValue);
// if(stat==SNMPAPI_FAILURE)
// AfxMessageBox("追加变量绑定表失败!"); //发送消息
stat=SnmpSendMsg(hSession,hSrcEntity,hDstEntity,hSendContext,hPdu);
if (stat!=SNMPAPI_SUCCESS)
AfxMessageBox("发送消息失败!"); SnmpFreeDescriptor(SNMP_SYNTAX_OID,(smiLPOPAQUE)&sOid);
SnmpFreeVbl(hVbl);
SnmpFreePdu(hPdu);
SnmpFreeEntity(hSrcEntity);
SnmpFreeEntity(hDstEntity);
SnmpFreeContext(hSendContext);
return hSession;
}//接受代理返回信息数据
void snmpReceive(HSNMP_SESSION hsession)
{
CString Re;
LONGLONG Val=0;
char cTmp[1024];
int i;
SNMPAPI_STATUS status;
HSNMP_PDU hPdu;
HSNMP_VBL hVbl;
HSNMP_ENTITY AgntEnt, MngEnt;
HSNMP_CONTEXT hRcvContext;
smiINT PduType, ErrorStatus, ErrorIndex;
smiINT32 nReqId;
smiVALUE sVal;
smiOID sOid;
status=SnmpRecvMsg(hsession,&AgntEnt,&MngEnt,&hRcvContext,&hPdu);
if(status!=SNMPAPI_SUCCESS)
AfxMessageBox("接收消息失败!");//(在这出错了!)
//获得错误信息
CString str;
str.Format("%d",SnmpGetLastError(hsession));
AfxMessageBox(str); //status=SnmpGetLastError(hsession);
// AfxMessageBox(Stat);
if (PduType==SNMP_PDU_RESPONSE)
{
status=SnmpGetVb(hVbl,1,&sOid,&sVal);
switch(sVal.syntax)
{
case SNMP_SYNTAX_INT32:
case SNMP_SYNTAX_UINT32:
case SNMP_SYNTAX_CNTR32:
case SNMP_SYNTAX_GAUGE32:
case SNMP_SYNTAX_TIMETICKS:
Val=sVal.value.sNumber;
break;
case SNMP_SYNTAX_CNTR64:
Val=sVal.value.hNumber.hipart<<32;
Val+=sVal.value.hNumber.lopart;
break;
case SNMP_SYNTAX_OCTETS:
case SNMP_SYNTAX_BITS:
case SNMP_SYNTAX_OPAQUE:
memset(cTmp,0,1024);
for(i=0;i<(int)sVal.value.string.len;i++)
cTmp[i]=sVal.value.string.ptr[i];
Re.Format("string:%s",cTmp);
break;
case SNMP_SYNTAX_IPADDR:
case SNMP_SYNTAX_NSAPADDR:
memset(cTmp, 0, 1024);
sprintf(cTmp, "%d.%d.%d.%d",
sVal.value.string.ptr[0],
sVal.value.string.ptr[1],
sVal.value.string.ptr[2],
sVal.value.string.ptr[3]);
Re.Format("String: %s",cTmp);
break;
case SNMP_SYNTAX_OID:
break;
default:
break;
}//end switch sVal.syntax
switch (nReqId) {
case 1: //1号请求是内存大小
Re.Format("MEM Size is %d", Val);
break;
case 2: //2号请求是系统描述
Re.Format("System Description is %d", Val);
break;
default:
break;
}//end switch nReqId
SnmpFreePdu(hPdu);
SnmpFreeVbl(hVbl);
SnmpFreeEntity(AgntEnt);
SnmpFreeEntity(MngEnt);
SnmpFreeContext(hRcvContext);
}
}void CFlowMonitorDlg::OnOK()
{
// TODO: Add extra validation here
HSNMP_SESSION hsession; //会话句柄
//CDialog::OnOK(); //发送pdu
hsession=snmpsend(this->m_hWnd); //接收消息
snmpReceive(hsession);
}
我用SnmpGetLastError()函数查看了一下,返回错误编号是8,winsnmp.h中宏定义如下
#define SNMPAPI_NOOP 8 // No operation performed