void main()
{
  HINSTANCE m_hInst;
  pSnmpExtensionInit m_Init;
  pSnmpExtensionInitEx m_InitEx;
  pSnmpExtensionQuery m_Query;
  pSnmpExtensionTrap m_Trap;
  HANDLE PollForTrapEvent;
  AsnObjectIdentifier SupportedView;
  UINT OID_ifEntryType[] = (1, 3, 6, 1, 2, 1, 2, 2, 1, 3);
  UINT OID_ifEntryNum[] = (1, 3, 6, 1, 2, 1, 2, 1);
  UINT OID_ipMACEntAddr[] = (1, 3, 6, 1, 2, 1, 2, 2, 1, 6);
  AsnObjectIdentifier MIB_ifMACEntAddr =
    ( sizeof(OID_ipMACEntAddr)  sizeof(UINT), OID_ipMACEntAddr );
  AsnObjectIdentifier MIB_ifEntryType =
    (sizeof(OID_ifEntryType)  sizeof(UINT), OID_ifEntryType);
  AsnObjectIdentifier MIB_ifEntryNum =
    (sizeof(OID_ifEntryNum)  sizeof(UINT), OID_ifEntryNum);
  RFC1157VarBindList varBindList;
  RFC1157VarBind varBind[2];
  AsnInteger errorStatus;
  AsnInteger errorIndex;
  AsnObjectIdentifier MIB_NULL = (0, 0);
  int ret;
  int dtmp;
  int i = 0, j = 0;
  bool found = false;
  char TempEthernet[13];
  m_Init = NULL;
  m_InitEx = NULL;
  m_Query = NULL;
  m_Trap = NULL;  /* 载入SNMP DLL并取得实例句柄 */
  m_hInst = LoadLibrary("inetmib1.dll");
  if (m_hInst < (HINSTANCE) HINSTANCE_ERROR)
  {
    m_hInst = NULL;
    return;
  }
  m_Init =
    (pSnmpExtensionInit) GetProcAddress(m_hInst, "SnmpExtensionInit");
  m_InitEx =
    (pSnmpExtensionInitEx) GetProcAddress(m_hInst,
                                          "SnmpExtensionInitEx");
  m_Query =
    (pSnmpExtensionQuery) GetProcAddress(m_hInst,
                                         "SnmpExtensionQuery");
  m_Trap =
    (pSnmpExtensionTrap) GetProcAddress(m_hInst, "SnmpExtensionTrap");
  m_Init(GetTickCount(), &PollForTrapEvent, &SupportedView);  /* 初始化用来接收m_Query查询结果的变量列表 */
  varBindList.list = varBind;
  varBind[0].name = MIB_NULL;
  varBind[1].name = MIB_NULL;  /* 在OID中拷贝并查找接口表中的入口数量 */
  varBindList.len = 1;        /* Only retrieving one item */
  SNMP_oidcpy(&varBind[0].name, &MIB_ifEntryNum);
  ret =
    m_Query(ASN_RFC1157_GETNEXTREQUEST, &varBindList, &errorStatus,
            &errorIndex);
  printf("# of adapters in this system : %in",
       varBind[0].value.asnValue.number);
  varBindList.len = 2;  /* 拷贝OID的ifType-接口类型 */
  SNMP_oidcpy(&varBind[0].name, &MIB_ifEntryType);  /* 拷贝OID的ifPhysAddress-物理地址 */
  SNMP_oidcpy(&varBind[1].name, &MIB_ifMACEntAddr);  do
  {    /* 提交查询,结果将载入 varBindList。
       可以预料这个循环调用的次数和系统中的接口卡数量相等 */
    ret =
      m_Query(ASN_RFC1157_GETNEXTREQUEST, &varBindList, &errorStatus,
              &errorIndex);
    if (!ret)
      ret = 1;
    else
        /* 确认正确的返回类型 */
      ret =
          SNMP_oidncmp(&varBind[0].name, &MIB_ifEntryType,
                       MIB_ifEntryType.idLength); if (!ret) (
    j++;
    dtmp = varBind[0].value.asnValue.number;
    printf("Interface #%i type : %in", j, dtmp);    /* Type 6 describes ethernet interfaces */
    if (dtmp == 6)
   {      /* 确认我们已经在此取得地址 */
      ret =
          SNMP_oidncmp(&varBind[1].name, &MIB_ifMACEntAddr,
                       MIB_ifMACEntAddr.idLength);
      if ((!ret) && (varBind[1].value.asnValue.address.stream != NULL))
      {
        if((varBind[1].value.asnValue.address.stream[0] == 0x44)
          && (varBind[1].value.asnValue.address.stream[1] == 0x45)
          && (varBind[1].value.asnValue.address.stream[2] == 0x53)
          && (varBind[1].value.asnValue.address.stream[3] == 0x54)
          && (varBind[1].value.asnValue.address.stream[4] == 0x00))
        {
          /* 忽略所有的拨号网络接口卡 */
          printf("Interface #%i is a DUN adaptern", j);
          continue;
        }
        if ((varBind[1].value.asnValue.address.stream[0] == 0x00)
            && (varBind[1].value.asnValue.address.stream[1] == 0x00)
            && (varBind[1].value.asnValue.address.stream[2] == 0x00)
            && (varBind[1].value.asnValue.address.stream[3] == 0x00)
            && (varBind[1].value.asnValue.address.stream[4] == 0x00)
            && (varBind[1].value.asnValue.address.stream[5] == 0x00))
        {
          /* 忽略由其他的网络接口卡返回的NULL地址 */
          printf("Interface #%i is a NULL addressn", j);
          continue;
        }
        sprintf(TempEthernet, "%02x%02x%02x%02x%02x%02x",
                varBind[1].value.asnValue.address.stream[0],
                varBind[1].value.asnValue.address.stream[1],
                varBind[1].value.asnValue.address.stream[2],
                varBind[1].value.asnValue.address.stream[3],
                varBind[1].value.asnValue.address.stream[4],
                varBind[1].value.asnValue.address.stream[5]);
        printf("MAC Address of interface #%i: %sn", j,
               TempEthernet);)
      }
    }
  } while (!ret);         /* 发生错误终止。 */
  getch();  FreeLibrary(m_hInst);
  /* 解除绑定 */
  SNMP_FreeVarBind(&varBind[0]);
  SNMP_FreeVarBind(&varBind[1]);
}

解决方案 »

  1.   

    如果你想做snmp, 建議還是用VC or BCB 吧
      

  2.   

    我想只是一个协议,用什么语言实现不会有太大的区别吧?因为我对delhpi比较熟,而且比较笨学,不会太多的语言.所以....
      

  3.   

    搞SNMP?
    Indy不就有TIdSNMP了,需要搞什么翻译这么麻烦的??
      

  4.   

    >>Indy不就有TIdSNMP了
    我怎麼說也算開發過snmp的, 但用 TIdSNMP 很多東西都調不出來!
    當然, 不排除我個人水平的問題!www.loncomip.com
      

  5.   

    SNMP其实是UDP
    SNMP的具体协议内容:
    http://www.rfc-editor.org/rfc/rfc1157.txtIndy不满足要求?不会自己改吗?有http://www.rfc-editor.org/rfc/rfc1157.txt的官方规定,改到满意为止了别指望Indy什么都能完成,Indy本身就有不少Bug了,我用Indy有3年多了,修改过Indy的N多Bug了。为什么需要Source版的组件?就是为了有问题自己改,不够用,自己扩充例如:Indy的组件不支持Tunnel代理,怎么办?自己添加处理就行了
    IndyTCPServer很多时候关闭出错,为什么?SetActive中有问题导致的
    Indy9对SSL证书支持有问题的,不能较验证书内容,同样可以通过手工写代码扩展
    Indy的内部InputBuffer也有问题,TCPConnection都有...不只是Indy,Rave一样有,Rave不支持中文字段,真的吗?内部一个函数不兼容MBCS而已,改改就行
      

  6.   

    提供另外的SNMP源码给你了
    有Source和Demo的
    synapse是简单小巧的组件,有时候会更好用的:)http://synapse.ararat.cz/files/contrib/snmpsyn.zip
      

  7.   

    要注意了
    需要组件http://synapse.ararat.cz/files/synasnap.zip
    支持的
      

  8.   

    你可能还需要
    Help
    http://synapse.ararat.cz/files/synahelp.zip
    Demo
    http://synapse.ararat.cz/files/synademo.zip官方站点http://synapse.ararat.cz/足够你解决问题的了:)
      

  9.   

    感谢ly_liuyang和aiirii的回答ly_liuyang给我的东西还没时间看,
    不过上面的程序不知大家知道在说什么吗那是一个用SNMP读MAC的例子希望对大家在帮助