在前三篇的內(nèi)容里,介紹了使用net-snmp實現(xiàn)agent的Get/Set命令,下面介紹一下發(fā)送trap消息。發(fā)送trap消息時,系統(tǒng)默認的端口是162。使用下面的代碼,可以實現(xiàn)trap消息的發(fā)送。
[cpp] view plaincopy print?
??void?init_alarm_info(void)??{??DEBUGMSGTL((“dcsserver”,??“initializing?(setting?callback?alarm)\n”));????snmp_alarm_register(5,???SA_REPEAT,???send_trap,???NULL???);??}??void?send_trap2(unsigned?int?clientreg,?void?*clientarg)??{????static?oid?oid_cpu_Alarm[]?=?{1,?3,?6,?1,?4,?1,?9000,?2,?1?};??static?oid?oid_memory_Alarm[]?=?{1,?3,?6,?1,?4,?1,?9000,?2,?2?};??static?oid?oid_disk_Alarm[]?=?{1,?3,?6,?1,?4,?1,?9000,?2,?3?};??netsnmp_pdu?*pdu;??int?status?=?0;????pdu?=?snmp_pdu_create(SNMP_MSG_TRAP2);???if?(?!pdu?)??{??CDcslog::GetInstance()->dlog_error(“send_trap?Failed?to?create?trap?PDU”);??return;??}??if(status?!=?0)??{??CDcslog::GetInstance()->dlog_error(“send_trap?snmp_add_var()?error”);??snmp_free_pdu(pdu);??return;??}????????status?=?create_trap_session(DEFAULT_ADDR,?0,?“public”,?SNMP_VERSION_1,?SNMP_MSG_TRAP);????if?(status?==?0)??{??CDcslog::GetInstance()->dlog_error(“send_trap?create_trap_session()?error”);??snmp_free_pdu(pdu);??return;??}????bool?flag?=false;????if?(?GetUsedCPU()>85)??{??flag?=?true;??status?=?snmp_add_var(pdu,?oid_cpu_Alarm,?OID_LENGTH(oid_cpu_Alarm),?‘s’,?“cpu?Alarming”);??}????if?(?GetUsedMemory()>85)??{??flag?=?true;??status?=?snmp_add_var(pdu,?oid_memory_Alarm,?OID_LENGTH(oid_memory_Alarm),?‘s’,?“memory?Alarming”);??}????if?(?GetUsedDisk()>85)??{??flag?=?true;??status?=?snmp_add_var(pdu,?oid_disk_Alarm,?OID_LENGTH(oid_disk_Alarm),?‘s’,?“disk?Alarming”);??}????if?(flag)??{??send_trap_vars(1,?0,?pdu->variables);??}????snmpd_free_trapsinks();??snmp_free_pdu(pdu);??}??
//該函數(shù)發(fā)送實時報警信息。與發(fā)送一般信息端口不同
void init_alarm_info(void)
{
DEBUGMSGTL((“dcsserver”,
“initializing (setting callback alarm)\n”));
//CDcsRunConfigManager *serverInfo = CDcsRunConfigManager::GetInstance();
snmp_alarm_register(5,/*serverInfo->GetTrapTimeSpan();*/ /* seconds, 秒 */
SA_REPEAT, /* repeat (every 30 seconds). 每隔30秒發(fā)送一個trap */
send_trap, /* our callback 我們的回調(diào)函數(shù) */
NULL /* no callback data needed */
);
}
void send_trap2(unsigned int clientreg, void *clientarg)
{
//MIB Tree中需要trap的報警節(jié)點節(jié)點主動trap的用./././././././2./
static oid oid_cpu_Alarm[] = {1, 3, 6, 1, 4, 1, 9000, 2, 1 };
static oid oid_memory_Alarm[] = {1, 3, 6, 1, 4, 1, 9000, 2, 2 };
static oid oid_disk_Alarm[] = {1, 3, 6, 1, 4, 1, 9000, 2, 3 };
netsnmp_pdu *pdu;
int status = 0;
// create pdu
pdu = snmp_pdu_create(SNMP_MSG_TRAP2); //SNMP_MSG_TRAP
if ( !pdu )
{
CDcslog::GetInstance()->dlog_error(“send_trap Failed to create trap PDU”);
return;
}
if(status != 0)
{
CDcslog::GetInstance()->dlog_error(“send_trap snmp_add_var() error”);
snmp_free_pdu(pdu);
return;
}
//SNMPV2 版本2
// status = create_trap_session(“127.0.0.1″, SNMP_TRAP_PORT, “public”, SNMP_VERSION_2c, SNMP_MSG_TRAP2);
//SNMPV1 第二個參數(shù)為SNMP_TRAP_PORT時有警告,應(yīng)該為0
status = create_trap_session(DEFAULT_ADDR, 0, “public”, SNMP_VERSION_1, SNMP_MSG_TRAP);
//第二個參數(shù)為SNMP_TRAP_PORT時有警告,應(yīng)該為0
if (status == 0)
{
CDcslog::GetInstance()->dlog_error(“send_trap create_trap_session() error”);
snmp_free_pdu(pdu);
return;
}
//在這里添加要發(fā)送的變量,可以添加發(fā)送的邏輯
bool flag =false;
//cpu利用率大于85%時,添加到trap列表中
if ( GetUsedCPU()>85)
{
flag = true;
status = snmp_add_var(pdu, oid_cpu_Alarm, OID_LENGTH(oid_cpu_Alarm), ‘s’, “cpu Alarming”);
}
//memory
if ( GetUsedMemory()>85)
{
flag = true;
status = snmp_add_var(pdu, oid_memory_Alarm, OID_LENGTH(oid_memory_Alarm), ‘s’, “memory Alarming”);
}
//disk:c:
if ( GetUsedDisk()>85)
{
flag = true;
status = snmp_add_var(pdu, oid_disk_Alarm, OID_LENGTH(oid_disk_Alarm), ‘s’, “disk Alarming”);
}
//列表中有內(nèi)容,則發(fā)送
if (flag)
{
send_trap_vars(1, 0, pdu->variables);
}
//釋放資源
snmpd_free_trapsinks();
snmp_free_pdu(pdu);
}
這樣發(fā)送的trap消息,是比較靈活的。
http://vcsky.net havenzhao
在net-snmp的源碼中,notification.c文件也是發(fā)送trap消息的,它使用的api是: send_v2trap(),但是要開啟snmp的trap服務(wù),才能發(fā)送成功。
到目前為止,已經(jīng)完整的介紹了windows下使用net-snmp實現(xiàn)agent擴展的相關(guān)技術(shù)。由于接觸的時間并不長,難免有不正確或者疏忽的地方,請多見諒。
總結(jié)
以上是生活随笔為你收集整理的windows下使用net-snmp实现agent扩展(四)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。