本人想做一个管理端的TRAP接收程序,最好用SNMP Manager API实现.因为它的VBL比较好设置.实现步骤较少.当然用WinSNMP API实现也好,只要提供有用的资料(请用WinSNMP API实现的资料尽量详细点,实现的函数SnmpRegister我知道,但不知道步骤),将以高分重谢!!!!
大吓们,救救我

解决方案 »

  1.   

    用WinSNMP:
    1、接收Trap:只要用SnmpRegister注册后就可以在消息响应函数里用SnmpRecvMsg和SnmpGetPduData提取到Trap消息,根据SnmpGetPduData函数返回的UDP类型判断(如果是SNMP_PDU_TRAP或SNMP_PDU_V1TRAP则是接收到trap消息),然后和一般的snmp消息一样进行处理即可。
    2、发送Trap:必须在变量绑定列表的第一个位置绑定(用SnmpCreateVbl函数)1.3.6.1.2.1.1.3.0(即sysUpTime节点),并设定它的值,第二个位置绑定(用SnmpSetVb函数)1.3.6.1.6.3.1.1.4.1.0(即snmpTrapOID节点),并设定它的值为你要发送的trap的MIB编号,举例如下:
             smiOID m_enterId;
    LPCSTR lpszEntMib ="1.3.6.1.4.1.300.0.1100"; //你自己的trap MIB编号
    SnmpStrToOid(lpszEntMib, &m_enterId);

    smiOID oid0;
    char lp[40]="1.3.6.1.2.1.1.3.0"; //必须设定第一个变量为sysUpTime
    smiVALUE tmpValue;
    tmpValue.syntax = SNMP_SYNTAX_TIMETICKS;
    tmpValue.value.uNumber = 10; // 设定sysUpTime的值
    SnmpStrToOid(lp,&oid0);
    hVbl=SnmpCreateVbl(hSession, &oid0, &tmpValue);
    ::SnmpFreeDescriptor(SNMP_SYNTAX_OID, (smiLPOPAQUE)&oid0);

    SnmpStrToOid("1.3.6.1.6.3.1.1.4.1.0", &oid0); // 设定第二个变量snmpTrapOID
    tmpValue.syntax = SNMP_SYNTAX_OID;  // 设定snmpTrapOID的值类型和值
    tmpValue.value.oid.ptr = m_enterId.ptr;
    tmpValue.value.oid.len = m_enterId.len;
    SnmpSetVb(hVbl, 0, &oid0, &tmpValue);
    SnmpFreeDescriptor(SNMP_SYNTAX_OID, (smiLPOPAQUE)&m_enterId);
    SnmpFreeDescriptor(SNMP_SYNTAX_OID, (smiLPOPAQUE)&oid0);

    smiINT32 errorState = NULL;
    smiINT32 errorIndex = NULL;
    // Create PDU
    if ((hPdu = SnmpCreatePdu(hSession, SNMP_PDU_TRAP, 0, errorState, errorIndex, hVbl)) 
    == SNMPAPI_FAILURE)
    {
    AfxMessageBox("Failed to Create PDU\n");
    return false;
    }
    if (errorState > 0)
    {
    AfxMessageBox("Error: error state = %d, error index = %d",errorState,errorIndex);
    return false;
    }

    if (SnmpSendMsg(hSession,NULL,hDstEntity,hContext,hPdu) != SNMPAPI_SUCCESS)
    {
    AfxMessageBox("Failed to Send message\n");
    return false;
    }以上仅供参考!
      

  2.   

    使用的步骤供参考:
    SnmpStartup()
    SnmpCreateSession()
    SnmpStrToEntity()
    SnmpSetTimeout()
    SnmpSetRetransmitMode()
    SnmpSetRetry()
    SnmpStrToContext()
    SnmpSetTranslateMode()
    SnmpRegister()
      

  3.   

    http://www.vckbase.com/document/viewdoc/?id=432
      

  4.   

    MyPro(活到老,学到老!) 请你详细讲讲定以snmpRegister,我的程序老出错!!
    1、定以:
    SnmpRegister(hSession,NULL,NULL,NULL,SNMPAPI_ON);
    提示:网络传输层未定以.
    2、我用Snmpgetpdudata时也老是提示出错,错误原因还没用getlasterror去查。
    搞定后来结贴!!!!
      

  5.   

    MyPro(活到老,学到老!) ( ) 
      

  6.   

    MyPro(活到老,学到老!) ( ) 帮我讲讲啊,结贴时给你100分
    我现在调晕了,SnmpRegister函数老出错,救救我啊!!!
      

  7.   

    不好意思,好长时间不看帖子了,你的机器有没有启动Snmp服务啊?
      

  8.   

    必须在变量绑定列表的第一个位置绑定(用SnmpCreateVbl函数)1.3.6.1.2.1.1.3.0(即sysUpTime节点),并设定它的值,第二个位置绑定(用SnmpSetVb函数)1.3.6.1.6.3.1.1.4.1.0(即snmpTrapOID节点),并设定它的值为你要发送的trap的MIB编号,举例如下:smiOID m_enterId;
    LPCSTR lpszEntMib ="1.3.6.1.4.1.300.0.1100"; //你自己的trap MIB编号++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++请教:自己的trap MIB编号, 作用是什么?      还有:snmpUptime 和 snmpTrapOID的作用是什么?
                设置它们的值的关键是什么?            望高人赐教!十分感激!!!
          谢谢!!!
      

  9.   

    谁不知道查msdn,问题是查了还要自己理解消化.
    何不问问已经把这个问题消化好了的人,节省时间和人力.