using System;
using System.Net;
using System.Net.Sockets;
using SnmpSharpNet;
namespace traprecv {
class Program {
static void Main(string[] args) {
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 162); //162是snmp的trap上报端口
EndPoint ep = (EndPoint)ipep;
socket.Bind(ep);
socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, 0);
bool run = true;
int inlen = -1;
while (run) {
byte[] indata = new byte[16 * 1024];
IPEndPoint peer = new IPEndPoint(IPAddress.Any, 0);
EndPoint inep = (EndPoint)peer;
try {
inlen = socket.ReceiveFrom(indata, ref inep);
}
catch( Exception ex ) {
Console.WriteLine("Exception {0}", ex.Message);
inlen = -1;
}
if (inlen > 0) {
int ver = SnmpPacket.GetProtocolVersion(indata, inlen);
if (ver == (int)SnmpVersion.Ver1) { //snmp版本1
// Parse SNMP Version 1 TRAP packet
SnmpV1TrapPacket pkt = new SnmpV1TrapPacket();
pkt.decode(indata, inlen);
Console.WriteLine("** SNMP Version 1 TRAP received from {0}:", inep.ToString());
Console.WriteLine("*** Trap generic: {0}", pkt.Pdu.Generic); //snmp的pdu类型,在0-6之间的值表示:标准的trap类型的一种,如果这个值是6表示是厂家自定义trap类型,这时可以通过Pdu.Specific来判断是厂家自定义的哪种trap类型
Console.WriteLine("*** Trap specific: {0}", pkt.Pdu.Specific); //厂家自定义trap
Console.WriteLine("*** Agent address: {0}", pkt.Pdu.AgentAddress.ToString());
Console.WriteLine("*** Timestamp: {0}", pkt.Pdu.TimeStamp.ToString());
Console.WriteLine("*** VarBind count: {0}", pkt.Pdu.VbList.Count);
Console.WriteLine("*** VarBind content:");
foreach (Vb v in pkt.Pdu.VbList) { //遍历输出snmp的pdu变量
Console.WriteLine("**** {0} {1}: {2}", v.Oid.ToString(), SnmpConstants.GetTypeName(v.Value.Type), v.Value.ToString());
}
Console.WriteLine("** End of SNMP Version 1 TRAP data.");
} else {
//解析snmp版本2数据包
SnmpV2Packet pkt = new SnmpV2Packet();
pkt.decode(indata, inlen);
Console.WriteLine("** SNMP Version 2 TRAP received from {0}:", inep.ToString());
if ((SnmpSharpNet.PduType)pkt.Pdu.Type != PduType.V2Trap) {
Console.WriteLine("*** NOT an SNMPv2 trap ****");
} else {
Console.WriteLine("*** Community: {0}", pkt.Community.ToString());
Console.WriteLine("*** VarBind count: {0}", pkt.Pdu.VbList.Count);
Console.WriteLine("*** VarBind content:");
foreach (Vb v in pkt.Pdu.VbList) {
Console.WriteLine("**** {0} {1}: {2}",
v.Oid.ToString(), SnmpConstants.GetTypeName(v.Value.Type), v.Value.ToString());
}
Console.WriteLine("** End of SNMP Version 2 TRAP data.");
}
}
} else {
if (inlen == 0)
Console.WriteLine("Zero length packet received.");
}
}
}
}
}