public PDU(UdpDatagram datagram) { _udp = datagram; MemoryStream stream = new MemoryStream(datagram.UdpData); BasicEncodingReader _reader = new BasicEncodingReader(stream); Asn1Type seqType = _reader.ReadType(); int seqLength = _reader.ReadLength(); Version = _reader.ReadInteger(); Community = _reader.ReadOctetString(); Asn1Type t = _reader.ReadType(); PduType = (PduType)(t.Byte & 0x1F); if (PduType == Snmp.PduType.Trap) { throw new NotImplementedException("SNMP v1 traps are not yet implemented"); } int len = _reader.ReadLength(); RequestId = _reader.ReadInteger(); ErrorStatus = _reader.ReadInteger(); ErrorIndex = _reader.ReadInteger(); Asn1Type type = _reader.ReadType(); if (type.Class != Asn1Class.Universal && type.Tag != Asn1Tag.Sequence) { throw new Exception("Sequence expected"); } int length = _reader.ReadLength(); VarBinds = new SortedDictionary <string, object>(); var list = _reader.ReadConstructedType(length); foreach (List <object> seq in list) { string oid = (string)seq[0]; VarBinds.Add(oid, seq[1]); } }
static void Asn1Encoding() { Console.WriteLine("\n======================= {0} =======================\n", MethodInfo.GetCurrentMethod().Name); var packets = PcapNg.ReadForward(fileName) .Where(b => b.Type == BlockType.EnhancedPacketBlock) .Cast <EnhancedPacketBlock>() .Take(5); foreach (var packet in packets) { int snmpLen = packet.PacketData.Length - 42; // 42 is the size of Ethernet + IP + UDP headers byte[] datagram = new byte[snmpLen]; Array.Copy(packet.PacketData, 42, datagram, 0, snmpLen); Console.WriteLine(BasicEncodingReader.ReadAllText(datagram)); } }