首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 开源 FAQ 第二书店 博文视点 程序员
频道: 研发 数据库 中间件 信息化 视频 .NET Java 游戏 移动 服务: 人才 外包 培训
    图书品种:235680
       
热门搜索: ASP.NET Ajax Spring Hibernate Java

编译

obsd32# gcc -o snmp1 snmp1.c

执行

obsd32# ./snmp1 -t 192.168.1.100

程序清单

obsd32# ./snmp1 -t 192.168.1.100

 

using: target: 192.168.1.100; port: 161; community name: "public"

 

30 29 02 01 00 04 06 70 75 62 6C 69 63 A0 1C 02 0).....public ..

04 7E 16 A2 5E 02 01 00 02 01 00 30 0E 30 0C 06 .~.¢^......0.0..

08 2B 06 01 02 01 01 05 00 05 00                .+.........

30 2F 02 01 00 04 06 70 75 62 6C 69 63 A2 22 02 0/.....public¢".

04 7E 16 A2 5E 02 01 00 02 01 00 30 14 30 12 06 .~.¢^......0.0..

08 2B 06 01 02 01 01 05 00 04 06 68 70 31 37 30 .+.........hp170

30                                              0

scan complete.

 

obsd32# ./snmp1 -t 192.168.1.100 -c internal

 

using: target: 192.168.1.100; port: 161; community name: "internal"

 

30 2B 02 01 00 04 08 69 6E 74 65 72 6E 61 6C A0 0+.....internal 

1C 02 04 7E 16 A2 5E 02 01 00 02 01 00 30 0E 30 ...~.¢^......0.0

0C 06 08 2B 06 01 02 01 01 05 00 05 00          ...+.........

 

30 31 02 01 00 04 08 69 6E 74 65 72 6E 61 6C A2 01.....internal¢

22 02 04 7E 16 A2 5E 02 01 00 02 01 00 30 14 30 "..~.¢^......0.0

12 06 08 2B 06 01 02 01 01 05 00 04 06 68 70 31 ...+.........hp1

37 30 30                                        700

 

scan complete.

snmp1.c程序从命令行接收目标IP地址、目标端口和社区名,用这些值创建一个SNMPv1 GetRequest协议数据单元(Protocol Data UnitPDU),封装在一个UDP数据报中并发送到指定的目标IP地址。然后程序将等待接收SNMP GetResponse应答报文。如果收到应答,则对其格式化并在标准输出设备上打印出来。

分析

       8行到第16行,载入程序所需的头文件。

       18行及第29行,指定默认的UDP端口及SNMP社区名。SNMP代理服务使用的标准端口为161UDP端口,在默认情况下,使用public作为社区名。

       23行到第75行,定义并实现hexdisp()函数。该函数接收两个参数,其中第一个参数为一个指向字符缓冲区的指针,第二个参数为带符号整数,表示字符缓冲区的长度。这个函数将缓冲区中的数据格式化为人们可读的形式,并在标准输出设备上打印出来,格式与tcpdump程序在使用–X标志时的格式相似。

       83行到第87行,定义了SNMP GetRequest报文的字节串。稍后会将SNMP1_ PDU_HEAD串复制到一个字符缓冲区,后面紧跟着SNMP社区名和SNMP1_ PDU_TAIL串。这3个值组合起来就构成了一个发送到远程主机的SNMP GetRequest请求报文。

       89行到第115行,定义并实现makegetreq()函数。这个函数用来构造一个SNMP GetRequest请求报文并存入指定的缓冲区。该函数的第1个参数为一个指向字符缓冲区的指针;第2个参数为一个带符号整数,表示以字节为单位的字符缓冲区的长度;第3个参数为一个整型指针,指向一个整型数,用来存放所创建的SNMP GetRequest请求报文的长度;第4个参数为SNMP社区名。SNMP GetRequest求中包括了对SNMP MIB-II system.sysName.0项的请求,它表示目标系统的主机名。

       105行,makegetreq()函数将SNMP1_PDU_HEAD值复制到提供的字符缓冲区。

       106行,makegetreq()函数将调用者提供的社区名复制到提供的字符缓冲区,紧跟在SNMP1_PDU_HEAD后面。

       107行,makegetreq()函数将SNMP1_PDU_TAIL值复制到字符缓冲区,并放在SNMP1_PDU_HEAD与社区名的后面。

       110行,makegetreq()函数将社区名的长度加上常量35,存入缓冲区的第2个字节,这是SNMP GetRequest请求报文所要求的格式。

       111行,makegetreq()函数将社区名的长度存入SNMP1_ PDU_HEAD值与SNMP社区名之间的一个字节存中。

       112行,makegetreq()函数将新创建的SNMP GetRequest报文的长度存入指针ole所指的变量中。

       114行,makegetreq()返回0,表示成功。至此,函数已经成功构造了一个SNMP GetRequest请求报文并存入指定的缓冲区。

       122行到第127行,定义并实现dores()函数。这个函数用来接收先前发送SNMP GetRequest报文的目标主机所产生的SNMP GetResonse报文,它使用recvfrom()函数来接收SNMP GetResonse报文,收到响应以后,调用hexdump()函数将所接收的数据以格式化的形式输出。

       144行到第167行,定义并实现doreq()函数。这个函数产生了一个SNMP GetRequest报文,并传给hexdump()函数进行格式化输出,然后将报文发送到目标IP地址和端口。发送数据时使用了send()函数。

       174行到第209行,定义并实现makeudpsock()函数。这个函数将目标IP地址从点分字符串格式转换为无符号整数格式,然后调用socket()函数创建一个收发UDP数据报文的套接字描述符,接下来调用connect()函数将套接字描述符与指定的目标地址和端口关联。所有操作成功以后,函数返回一个合法的套接字描述符,否则返回一个负整数。

       216行到第243行,定义并实现scan()函数。这个函数调用makeudpsock()创建一个套接字描述符并初始化,然后将创建的套接字描述符传给doreq()函数。doreq()函数将创建一个SNMP GetRequest报文并发送到目标IP地址和端口。最后,scan()函数调用dores()接收目标主机返回的SNMP GetResonse报文。如果没有错误,scan()函数将返回0,否则返回一个负整数。

       250行到第257行,定义并实现usage()函数。这个函数用来显示SNMP1程序的用法信息。

       260行到第316行,定义并实现main()函数,这是整个程序的入口,它处理用户提供的命令行参数,并调用scan()函数进行扫描。

查看所有评论(0)条】

最近评论



正在载入评论列表...
热点评论