SNMP trap消息为何不能正确发往指定端口162.

原创 2011年01月25日 15:25:00

最近做网络摄像机,有局点要求需要按SNMP协议上报消息,于是从网站http://www.net-snmp.org/下载了一个snmp源码包5.2.6,tar解压,交叉编译:

./configure --build=i686-linux --host=arm-merlin-linux CC=arm-merlin-linux-uclibc-gcc --with-mib-modules="examples/notification" --with-endianness=little LDFLAGS="-static"

(表示在x86的linuxOS上编译板上运行的程序,build是编译机,host是运行机,CC是编译器名,target不需要,因为编译出来的不是工具,加入一个notification的mib库,如何加入mib,看官网上有,最后使用小端静态编译)

如果在PC上用,则./configure --with-mib-modules="examples/notification" 简单的不得了

 

下面的代码演示如何从一个代理进程向管理进程上报trap消息(此处用来发心跳),当然也可以通过配置snmp让它自动上发trap消息,但我们想编程自己灵活控制.

 

#include <stdlib.h>

#include <unistd.h>

#include <string.h>

#include <strings.h>

#include <sys/types.h>

#include <netinet/in.h>

#include <sys/time.h>

#include <time.h>

#include <sys/select.h>

#include <sys/socket.h>

#include <netdb.h>

#include <arpa/inet.h>

 

#include <net-snmp/net-snmp-config.h>

#include <net-snmp/net-snmp-includes.h>

 

int main()

{

netsnmp_session ,session;

static int i=0;

if (i==0)

{

snmp_sess_init(&session);

i=1;

}

 

session.version = SNMP_VERSION_2c;

session.peername = "192.168.1.3";

session.remote_port = 162;

session.community = (unsigned char*)"public";

session.community_len = strlen((char*)session.community);

session.retries = 3;

session.timeout = 2000;

session.sessid = 0;

 

snmp_session *ss = snmp_open(&session);

if (ss==NULL) return -1;

 

netsnmp_pdu *pdu = snmp_pdu_create(SNMP_MSG_TRAP2);

long sysuptime = get_uptime();

char csysuptime[32];

sprintf(csysuptime,"%ld", sysuptime);

oid oid_sysuptime[] = {1,3,6,1,2,1,1,3,0};

int status = snmp_add_var(pdu, oid_sysuptime,OID_LENGTH(oid_sysuptime),'t', csysuptime);

if (status !=0) return -1;//一般不会出错

 

status = snmp_send(ss,pdu);

if (status == 0) return -2; //send要有东西发出去,返回0就不对了

 

snmp_close(ss);

return 0;

}

//以上的变量定义是按Effective C++的第XX条的原则:变量要到了用的时候才定义,个人喜欢这一条,所以坚持用了,除非是一些老的编译器,变量定义必须放在前面,否则我不会先定义一大堆的变量放在那晾着.

 

编译运行,管理进程未收到trap消息(何为管理进程,何为代理进程,看看资料或<tcp/ip详解 卷一就知道了)

抓包一看,发现消息发到161端口去了,上百度搜了一下,发现人家也有同样的问题,无果,最后几番折腾,才在一个SNMP_API.H文件里看到一个结构体stuct snmp_session一行注释:

/**UDP port number of peer (LO LONGER USED - USE peername INSTEAD)*/

u_short remote_port;

原来这个参数不用了,搞不懂为何要用peer_name来替代端口号,却还让remote_port这个字段放在这继续让程序员犯错,不用了为何不注释掉这个字段?让人家编译就能查错总比运行时诡异要好的多吧.

 

修改一下代码:

session.peername = "192.168.1.3:162";//应该是用这个格式

再试一下../sendtrap(make后生成的执行文件) 果然,管理进程正确收到消息了.抓包也可以看到destination port是162了.

 

再把

session.remote_port = 0;,不影响正确性.

snmp trap配置

一、trap的用途 TRAP是提供从代理进程到管理站的异步报告机制。 为了使管理站能够及时而又有效地对被管理设备进行监控,同时又不过分增加网络的通信负载,必须使用陷入(TRAP)制导的轮讯过程。代...
  • wangcg123
  • wangcg123
  • 2016年12月23日 12:03
  • 2146

SNMP Trap的功能介绍

前面我们已经对SNMP协议有所了解了,随着对这个协议的了解,我们也发现,它的更能更为强大。其中包括了多种协议的支持。那么今天我们就来详细介绍一下SNMP Trap的具体内容。那么什么是SNMP Tra...
  • Galdys
  • Galdys
  • 2011年12月15日 09:23
  • 1316

SNMP协议详解

简单网络管理协议(SNMP)是TCP/IP协议簇的一个应用层协议。在1988年被制定,并被Internet体系结构委员会(IAB)采纳作为一个短期的网络管理解决方案;由于SNMP的简单性,在Inter...
  • shanzhizi
  • shanzhizi
  • 2013年09月12日 15:51
  • 147432

mib浏览器中的trap-receiver 不能绑定162端口

打开mib浏览器中的trap-receiver时弹出err提示框,提示你不能绑定162端口。 此时需要打开电脑的终端输入:net stop snmptrap 这事就不会再提示不能绑定的错误提示了;...
  • BABYWANG1128
  • BABYWANG1128
  • 2017年10月20日 10:27
  • 100

TCP/UDP常用详解

著名端口UNIX 特有的端口注册的端口数据报传递协议端口Kerberos(工程 Athena/MIT)端口未注册的端口 著名端口 端口号码 / 层 名称 注释 1 tc...
  • u012486840
  • u012486840
  • 2016年09月22日 10:59
  • 2298

NET-SNMP基本命令

当环境设置好后,运行snmpd,即snmp代理进程,就可以使用管理工具查询其中的信息了。Net- snmp提供的查询工具有很多,这里只介绍常用的几个,而且大部分查询命令的格式都大同小异。这里以.iso...
  • wys2011101169
  • wys2011101169
  • 2013年12月05日 16:55
  • 2813

Snmp学习笔记

相关链接:Snmp学习笔记使用snmp4j实现Snmp功能(一)使用snmp4j实现Snmp功能(二)使用snmp4j实现Snmp功能(三)SNMP是英文“Simple Network Managem...
  • clearwater21cn
  • clearwater21cn
  • 2007年06月26日 19:10
  • 56910

什么是Trap消息?

用一句话来说的话,SNMP Trap就是被管理设备主动发送消息给NMS的一种机制。         当被管理设备出现性能问题,甚至是网络设备接口宕掉问题时,Agent需要主动发送消息通知NMS。假如...
  • u011804580
  • u011804580
  • 2014年12月05日 11:16
  • 2994

net-snmp的移植,是基于静态编译的

关于net-snmp的移植,是基于静态编译的,动态的没有做成功,在arm上的移植过程大致如下: 如果没有涉及到扩展agent,则蓝色字体不需要理会。 1.将源码包另找一个路径放下,解压  tar...
  • renhualu
  • renhualu
  • 2014年12月07日 22:16
  • 421

交叉编译SNMP

http://blog.csdn.net/livingpark/archive/2008/10/10/3048575.aspx 交叉编译SNMP 一般系统都会有SNMP的支持,下载了net-snmp-...
  • juneman
  • juneman
  • 2011年05月22日 21:35
  • 1703
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:SNMP trap消息为何不能正确发往指定端口162.
举报原因:
原因补充:

(最多只允许输入30个字)