SNMPAPI_STATUS lStat;
char* LocalAddr = "10.151.97.39";
char* AgentAddr = "10.151.96.206";
unsigned long major = 2;
unsigned long minor = 0;
unsigned long level = 2;
unsigned long translate = SNMPAPI_UNTRANSLATED_V1;
unsigned long retran = SNMPAPI_ON;
lStat = SnmpStartup(&major, &minor, &level, &translate, &retran);
if(lStat != SNMPAPI_SUCCESS)
{
printf("SNMP Initialize error\n");
return 0;
}
else
printf("SNMP has been initialized\n");
SnmpSetTranslateMode(SNMPAPI_UNTRANSLATED_V1);
SnmpSetRetransmitMode(SNMPAPI_ON);
HSNMP_SESSION hSession;
SNMPAPI_CALLBACK CallBack = &Snmp_CallBack_Func;
hSession = SnmpCreateSession(NULL,0,CallBack,NULL);
if(hSession == SNMPAPI_FAILURE)
{
printf("Create Session error\n");
return 0;
}
else
printf("SNMP session has been created\n\n");
.
HSNMP_ENTITY LocalEntity;
HSNMP_ENTITY AgentEntity;
LocalEntity = SnmpStrToEntity(hSession, LocalAddr);
if(LocalEntity == SNMPAPI_FAILURE)
{
printf("Entiy local error\n");
SnmpGetLastError(hSession);
return 0;
}
AgentEntity = SnmpStrToEntity(hSession, AgentAddr);
if(AgentEntity == SNMPAPI_FAILURE)
{
printf("Entiy local error\n");
SnmpGetLastError(hSession);
return 0;
}
smiOID oid;
lStat = SnmpStrToOid("1.3.6.1.2.1.1.1.0",&oid);
if(lStat == SNMPAPI_FAILURE)
{
printf("OID error\n");
SnmpGetLastError(hSession);
return 0;
}
smiVALUE lVal;
smiOCTETS lOct;
char* _SysDescr = "SysDescr";
int length = strlen(_SysDescr);
//HSNMP_ENTITY _Name = SnmpStrToEntity(hSession,_SysDescr);
unsigned char c1[8];
for(int i = 0; i < length; i ++)
c1 = (unsigned char)(_SysDescr);
lOct.len = length;
lOct.ptr = c1;
lVal.syntax = SNMP_SYNTAX_OCTETS;
lVal.value.string = lOct;
HSNMP_VBL lVbl;
lVbl = SnmpCreateVbl(hSession,&oid,&lVal);
if(lVbl == SNMPAPI_FAILURE)
{
printf("Creating varbindlist structure error\n");
SnmpGetLastError(hSession);
return 0;
}
HSNMP_PDU lPDU = SnmpCreatePdu(hSession, SNMP_PDU_GET, 0, 0, 0, lVbl);
//Community
smiOCTETS lContext;
char* cont = "public";
lContext.len = strlen(cont);
lContext.ptr = (smiLPBYTE)(cont);
HSNMP_CONTEXT hContext = SnmpStrToContext(hSession, &lContext);
if(hContext == SNMPAPI_FAILURE)
{
printf("Context errror");
SnmpGetLastError(hSession);
return 0;
}
SNMPAPI_STATUS hSend = SnmpSendMsg(hSession, LocalEntity, AgentEntity, hContext, lPDU);
if(hSend == SNMPAPI_FAILURE)
{
printf("Send error");
SnmpGetLastError(hSession);
return 0;
}
SNMPAPI_STATUS hRecv = SnmpRecvMsg(hSession, &AgentEntity, &LocalEntity, &hContext, &lPDU);
if(hRecv == SNMPAPI_FAILURE)
{
printf("Can't recieve\n");
}
//сдесь hRecv равно 0. т.е. сообщение не может быть получено, следовательно, устройство мне его не отправляет?
SnmpFreeContext(hContext);
SnmpFreePdu(lPDU);
SnmpFreeVbl(lVbl);
SnmpClose(hSession);
printf("Session is closed\n");
SnmpCleanup();
Проблема с SnmpRecvMsg
У меня большая проблема. Нужно сделать SNMP-менеджер. Пишу на Visual C++, для решения задачи использую стандартные функции из winsnmp.h Если у кого-нибудь возникали похожие проблемы, поделитесь опытом, пожалуйста. А проблема заключается в следующем: функция SnmpSendMsg вполне успешно выполняется, но не вызывается callback функция, а если попробовать напрямую вызвать SnmpRecvMsg, то при ее выполнении возникает ошибка (hRecv = SNMPAPI_FAILURE)
Может быть, я что-то неправильно делаю?
Заранее большое спасибо :)
Код: