WEB开发网
开发学院软件开发VC 使用SNMP编辑(添加/删除/修改)ARP表 阅读

使用SNMP编辑(添加/删除/修改)ARP表

 2010-07-20 20:44:55 来源:WEB开发网   
核心提示:得到ARP条目函数GetEntries类似arp.exe -a,可以得到ARP条目,函数有三个参数:PTable指针指向arpTable结构数组,使用SNMP编辑(添加/删除/修改)ARP表(3),用于填充IP和MAC地址,TableLength是数组长度AdapterIndex是NIC适配器的编号,我使用3个OID来

得到ARP条目

函数GetEntries类似arp.exe -a,可以得到ARP条目,函数有三个参数:

PTable指针指向arpTable结构数组,用于填充IP和MAC地址。

TableLength是数组长度

AdapterIndex是NIC适配器的编号。

我使用3个OID来得到ARP表条目:

OID[0] = "1.3.6.1.2.1.4.22.1.1" ,得到接口索引号。

然后和OID[1] = "1.3.6.1.2.1.4.22.1.2"比较,得到IP和MAC地址

OID[2] = "1.3.6.1.2.1.4.22.1.4", 得到条目类型(静态或动态)//-----------------------------------------------------------------------
// Function:     GetEntries: Read ARP table for specific NIC interface.
//
// Parameters:
//  pTable     Pointer to array of arpTable struct
//  TableLength   Length of the array
//  AdapterIndex  NIC Adapter index number
//
// Returns:
//          Number of read ARP entries
//-----------------------------------------------------------------------
int CARP::GetEntries(arpTable* pTable, int TableLength, int AdapterIndex)
{
  // Be sure initialize SNMP true
  if (!bInitialized)
    return 0;
  SnmpVarBindList    SVBList[3];
  SnmpVarBind      SVBVars[3];
  UINT          OID[3][10];
  AsnInteger32      aiErrorStatus[3], aiErrorIndex[3];
  AsnObjectIdentifier  AsnOID0 = {sizeof(OID[0])/sizeof(UINT), OID[0]};
  AsnObjectIdentifier  AsnOID1 = {sizeof(OID[1])/sizeof(UINT), OID[1]};
  AsnObjectIdentifier  AsnOID2 = {sizeof(OID[2])/sizeof(UINT), OID[2]};
  unsigned long     pIPAddress;
  unsigned long     pMACAddress;
  int          iEntries;

  //-----------------------------------------------------------------------
  //  Fill array of 3 OIDs
  //
  //  OID[0]  : "1.3.6.1.2.1.4.22.1.1", ipNetToMediaIfIndex
  //        The interface on which this entry's equivalence is effective
  //
  //  OID[1]  : "1.3.6.1.2.1.4.22.1.2", ipNetToMediaPhysAddress
  //        The media-dependent 'physical' address
  //
  //  OID[2]  : "1.3.6.1.2.1.4.22.1.4", ipNetToMediaType
  //        Entry type: 1:Other, 2:Invalid(Remove), 3:Dynamic, 4:Static
  //
  for (int count=0; count<3; count++)
  {
    OID[count][0]    = 1;
    OID[count][1]    = 3;
    OID[count][2]    = 6;
    OID[count][3]    = 1;
    OID[count][4]    = 2;
    OID[count][5]    = 1;
    OID[count][6]    = 4;
    OID[count][7]    = 22;
    OID[count][8]    = 1;
    switch(count)
    {
    case 0:
      // Adapter interface
      OID[count][9]  = 1;
      break;
    case 1:
      // MAC address
      OID[count][9]  = 2;
      break;
    case 2:
      // Entry Type
      OID[count][9]  = 4;
      break;
    }
  }
  ZeroMemory(pTable, sizeof(arpTable)*TableLength);
  SVBList[0].len = 1;
  SVBList[0].list = &SVBVars[0];
  SnmpUtilOidCpy(&SVBVars[0].name, &AsnOID0);
  SVBList[1].len = 1;
  SVBList[1].list = &SVBVars[1];
  SnmpUtilOidCpy(&SVBVars[1].name, &AsnOID1);
  SVBList[2].len = 1;
  SVBList[2].list = &SVBVars[2];
  SnmpUtilOidCpy(&SVBVars[2].name, &AsnOID2);
  iEntries    = 0;
  do
  {
    aiErrorStatus[0]  = 0;
    aiErrorIndex[0]   = 0;
    aiErrorStatus[1]  = 0;
    aiErrorIndex[1]   = 0;
    aiErrorStatus[2]  = 0;
    aiErrorIndex[2]   = 0;
    // Query information of 3 OIDs
    if (pfnSnmpExtensionQuery(SNMP_PDU_GETNEXT, &SVBList[0], &aiErrorStatus[0], &aiErrorIndex[0]))
      if (pfnSnmpExtensionQuery(SNMP_PDU_GETNEXT, &SVBList[1], &aiErrorStatus[1], &aiErrorIndex[1]))
        if (pfnSnmpExtensionQuery(SNMP_PDU_GETNEXT, &SVBList[2], &aiErrorStatus[2], &aiErrorIndex[2]))
          if (aiErrorStatus[0] == SNMP_ERRORSTATUS_NOERROR &&
            aiErrorStatus[1] == SNMP_ERRORSTATUS_NOERROR &&
            aiErrorStatus[2] == SNMP_ERRORSTATUS_NOERROR) // Check for error
          {
            //-----------------------------------------------------------------------
            // From MSDN Help: http://msdn2.microsoft.com/en-us/library/aa378021.aspx
            //
            // If the extension agent cannot resolve the variable bindings on a Get Next request,
            // it must change the name field of the SnmpVarBind structure to the value of the object
            // identifier immediately following that of the currently supported MIB subtree view.
            // For example, if the extension agent supports view ".1.3.6.1.4.1.77.1", a Get Next
            // request on ".1.3.6.1.4.1.77.1.5.1" would result in a modified name field of ".1.3.6.1.4.1.77.2".
            // This signals the SNMP service to continue the attempt to resolve the variable bindings
            // with other extension agents
            //-----------------------------------------------------------------------
            if(SnmpUtilOidNCmp(&SVBVars[0].name, &AsnOID0, AsnOID0.idLength))
              break;
            if(SnmpUtilOidNCmp(&SVBVars[1].name, &AsnOID1, AsnOID1.idLength))
              break;
            if(SnmpUtilOidNCmp(&SVBVars[2].name, &AsnOID2, AsnOID2.idLength))
              break;
            // Verify selected Adapter interface
            if (AdapterIndex == SVBList[0].list->value.asnValue.number)
            {
              // pIPAddress get pointer ro IP Address
              pIPAddress    = (unsigned long)SVBList[1].list->name.ids;
              pTable[iEntries].IPAddress[0]  = *(unsigned char *)(pIPAddress + 44);
              pTable[iEntries].IPAddress[1]  = *(unsigned char *)(pIPAddress + 48);
              pTable[iEntries].IPAddress[2]  = *(unsigned char *)(pIPAddress + 52);
              pTable[iEntries].IPAddress[3]  = *(unsigned char *)(pIPAddress + 56);
              // pIPAddress get pointer ro MAC Address
              pMACAddress    = (unsigned long)SVBList[1].list->value.asnValue.string.stream;
              if (pMACAddress)
              {
                pTable[iEntries].MACAddress[0]  = *(unsigned char *)(pMACAddress + 0);
                pTable[iEntries].MACAddress[1]  = *(unsigned char *)(pMACAddress + 1);
                pTable[iEntries].MACAddress[2]  = *(unsigned char *)(pMACAddress + 2);
                pTable[iEntries].MACAddress[3]  = *(unsigned char *)(pMACAddress + 3);
                pTable[iEntries].MACAddress[4]  = *(unsigned char *)(pMACAddress + 4);
                pTable[iEntries].MACAddress[5]  = *(unsigned char *)(pMACAddress + 5);
              }
              // Entry Type
              pTable[iEntries].Type  = (unsigned long)SVBList[2].list->value.asnValue.number;
              // Type must be one of (1, 2, 3, 4)
              if (pTable[iEntries].Type>=1 && pTable[iEntries].Type<=4)
                iEntries++;    // Move to next array position
            }
          }
          else
            break;  // If error exit do-while
  }
  while(iEntries < TableLength);
  // Frees the memory allocated for the specified object identifiers
  SnmpUtilOidFree(&SVBVars[2].name);
  SnmpUtilOidFree(&SVBVars[1].name);
  SnmpUtilOidFree(&SVBVars[0].name);
  return iEntries;  // Return number of Entries
}

上一页  1 2 3 4 5  下一页

Tags:使用 SNMP 编辑

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接