📄 snmputil.c
字号:
while(1)
{
if (!SnmpMgrRequest(session, requestType, &variableBindings,
&errorStatus, &errorIndex))
{
// The API is indicating an error.
printf("error on SnmpMgrRequest %d\n", GetLastError());
break;
}
else
{
// The API succeeded, errors may be indicated from the remote
// agent.
char *string = NULL;
UINT nBindingsLeft = variableBindings.len;
UINT nSubTreesDone = 0;
RFC1157VarBind *tempVarBindList;
if (errorStatus == SNMP_ERRORSTATUS_NOERROR)
{
// Test for end of subtree or end of MIB.
for(i=0; i < nBindingsLeft; i++)
{
// obtain root
j = rootOidXlat[i];
if (SnmpUtilOidNCmp(&variableBindings.list[i].name,
&rootOidList[j], rootOidList[j].idLength))
{
nSubTreesDone++;
rootOidXlat[i] = 0xffffffff;
}
else
{
SnmpMgrOidToStr(&variableBindings.list[i].name, &string);
printf("Variable = %s\n", string);
if (string) SnmpUtilMemFree(string);
printf("Value = ");
SnmpUtilPrintAsnAny(&variableBindings.list[i].value);
printf("\n");
}
AsnValueFree(&variableBindings.list[i].value);
}
if (nBindingsLeft > 1)
{
printf("\n"); // separate table entries
}
}
else if (errorStatus == SNMP_ERRORSTATUS_NOSUCHNAME)
{
if (!(errorIndex && (errorIndex <= (INT)nBindingsLeft)))
{
errorIndex = 1; // invalidate first variable
}
nSubTreesDone++;
rootOidXlat[errorIndex-1] = 0xffffffff;
errorStatus = 0;
errorIndex = 0;
}
else
{
printf("Error: errorStatus=%d, errorIndex=%d \n",
errorStatus, errorIndex);
break;
}
// Test to see if any or all subtrees walked
if (nSubTreesDone == 0)
{
continue;
}
else if (nSubTreesDone >= nBindingsLeft)
{
printf("End of MIB subtree.\n\n");
break;
}
// Fixup variable list
tempVarBindList = variableBindings.list;
variableBindings.len = nBindingsLeft - nSubTreesDone;
variableBindings.list = (RFC1157VarBind *)SnmpUtilMemAlloc(
variableBindings.len * sizeof(RFC1157VarBind));
for(i=0, j=0; i < nBindingsLeft; i++)
{
if ((rootOidXlat[i] != 0xffffffff) &&
(j < variableBindings.len))
{
SnmpUtilVarBindCpy(
&variableBindings.list[j],
&tempVarBindList[i]
);
rootOidXlat[j++] = rootOidXlat[i];
}
SnmpUtilVarBindFree(
&tempVarBindList[i]
);
}
SnmpUtilMemFree(tempVarBindList);
} // end if()
} // end while()
// Free the variable bindings that have been allocated.
SnmpUtilVarBindListFree(&variableBindings);
for (i=0; i < rootOidLen; i++)
{
SnmpUtilOidFree(&rootOidList[i]);
}
SnmpUtilMemFree(rootOidList);
}
else if (operation == TRAP)
{
// Trap handling can be done two different ways: event driven or
// polled. The following code illustrates the steps to use event
// driven trap reception in a management application.
HANDLE hNewTraps = NULL;
if (!SnmpMgrTrapListen(&hNewTraps))
{
printf("error on SnmpMgrTrapListen %d\n", GetLastError());
return 1;
}
else
{
printf("snmputil: listening for traps...\n");
}
while(1)
{
DWORD dwResult;
if ((dwResult = WaitForSingleObject(hNewTraps, 0xffffffff))
== 0xffffffff)
{
printf("error on WaitForSingleObject %d\n",
GetLastError());
}
else if (!ResetEvent(hNewTraps))
{
printf("error on ResetEvent %d\n", GetLastError());
}
else
{
AsnObjectIdentifier enterprise;
AsnNetworkAddress agentAddress;
AsnNetworkAddress sourceAddress;
AsnInteger genericTrap;
AsnInteger specificTrap;
AsnOctetString community;
AsnTimeticks timeStamp;
RFC1157VarBindList variableBindings;
UINT i;
char *string = NULL;
while(SnmpMgrGetTrapEx(
&enterprise,
&agentAddress,
&sourceAddress,
&genericTrap,
&specificTrap,
&community,
&timeStamp,
&variableBindings))
{
printf("Incoming Trap:\n"
" generic = %d\n"
" specific = %d\n",
genericTrap,
specificTrap);
SnmpMgrOidToStr(&enterprise, &string);
printf (" enterprise = %s\n", string);
if (string)
SnmpUtilMemFree(string);
SnmpUtilOidFree(&enterprise);
if (agentAddress.length == 4) {
printf (" agent = %d.%d.%d.%d\n",
(int)agentAddress.stream[0],
(int)agentAddress.stream[1],
(int)agentAddress.stream[2],
(int)agentAddress.stream[3]);
}
if (agentAddress.dynamic) {
SnmpUtilMemFree(agentAddress.stream);
}
if (sourceAddress.length == 4) {
printf (" source IP = %d.%d.%d.%d\n",
(int)sourceAddress.stream[0],
(int)sourceAddress.stream[1],
(int)sourceAddress.stream[2],
(int)sourceAddress.stream[3]);
}
else if (sourceAddress.length == 10) {
printf (" source IPX = %.2x%.2x%.2x%.2x."
"%.2x%.2x%.2x%.2x%.2x%.2x\n",
(int)sourceAddress.stream[0],
(int)sourceAddress.stream[1],
(int)sourceAddress.stream[2],
(int)sourceAddress.stream[3],
(int)sourceAddress.stream[4],
(int)sourceAddress.stream[5],
(int)sourceAddress.stream[6],
(int)sourceAddress.stream[7],
(int)sourceAddress.stream[8],
(int)sourceAddress.stream[9]);
}
if (sourceAddress.dynamic) {
SnmpUtilMemFree(sourceAddress.stream);
}
if (community.length)
{
string = SnmpUtilMemAlloc (community.length + 1);
memcpy (string, community.stream, community.length);
string[community.length] = '\0';
printf (" community = %s\n", string);
SnmpUtilMemFree(string);
}
if (community.dynamic) {
SnmpUtilMemFree(community.stream);
}
for(i=0; i < variableBindings.len; i++)
{
SnmpMgrOidToStr(&variableBindings.list[i].name, &string);
printf(" variable = %s\n", string);
if (string) SnmpUtilMemFree(string);
printf(" value = ");
SnmpUtilPrintAsnAny(&variableBindings.list[i].value);
} // end for()
printf("\n");
SnmpUtilVarBindListFree(&variableBindings);
}
dwResult = GetLastError(); // check for errors...
if ((dwResult != NOERROR) && (dwResult != SNMP_MGMTAPI_NOTRAPS))
{
printf("error on SnmpMgrGetTrap %d\n", dwResult);
}
}
} // end while()
} // end if(operation)
if (operation != TRAP)
{
// Close SNMP session with the remote agent.
if (!SnmpMgrClose(session))
{
printf("error on SnmpMgrClose %d\n", GetLastError());
return 1;
}
}
// Let the command interpreter know things went ok.
return 0;
} // end main()
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -