Search code examples
c#subscribesnmp-trapsnmptrapd

How to subscribe for the snmpclient (printer) in C#


Actually I have a sample SNMP trap receiver code. But its like a UDP socket is established and it listens for the trap. I am testing the code manually by generating the trap with the help of an exe. But now I have to subscribe for the snmp client (printer) from which I need to receive the Trap. Could anyone please help me to write a subscription code to subscribe for the printer from the listener code.

snmptraplistener code:

class Program {
    static void Main(string[] args) {
        // Construct a socket and bind it to the trap manager port 162
        Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
        IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 162);
        EndPoint ep = (EndPoint)ipep;
        socket.Bind(ep);
        // Disable timeout processing. Just block until packet is received
        socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, 0);
        bool run = true;
        int inlen = -1;
        while (run) {
            byte[] indata = new byte[16 * 1024];
            // 16KB receive buffer int inlen = 0;
            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) {
                // Check protocol version int
                int ver = SnmpPacket.GetProtocolVersion(indata, inlen);
                if (ver == (int)SnmpVersion.Ver1) {
                    // 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);
                    Console.WriteLine("*** Trap specific: {0}", pkt.Pdu.Specific);
                    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) {
                        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 {
                    // Parse SNMP Version 2 TRAP packet
                    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.");
            }
        }
    }
}

}


Solution

  • In general, what you asked is not a programming question, because your trap listener can only monitor UDP/SNMP packets at port 162 and there is no way for it to subscribe to anything.

    It would be the responsibilities of the printer administrators to configure the SNMP agent on that printer to send traps to your listener (IP/port).