прослушиватель ловушек snmp не получает сообщения

#c# #snmp-trap #sharp-snmp #.net-4.7.1 #snmpsharpnet

#c# #snmp-ловушка #sharp-snmp #.net-4.7.1 #snmpsharpnet

Вопрос:

Итак, я создаю приемник snmp-ловушек для приема сообщений snmp-ловушек. я использую пакет sharpsnmp-net от lexstudios, а также sample.engine с pipline из github. Я создаю простое приложение wpf, чтобы просто отображать сообщения на экране для тестирования всего в .net 4.7.1.

Итак, для части прослушивания я грубо использовал образец snmpd.

 public partial class MainWindow : Window
    {
        private SnmpEngine _engine;
        private const string StrAllUnassigned = "All Unassigned";

        public MainWindow()
        {
            var store = new ObjectStore();
            store.Add(new SysDescr());
            store.Add(new SysObjectId());
            store.Add(new SysUpTime());
            store.Add(new SysContact());
            store.Add(new SysName());
            store.Add(new SysLocation());
            store.Add(new SysServices());
            store.Add(new SysORLastChange());
            store.Add(new SysORTable());
            store.Add(new IfNumber());
            store.Add(new IfTable());

            var users = new UserRegistry();
            users.Add(new OctetString("neither"), DefaultPrivacyProvider.DefaultPair);
            users.Add(new OctetString("authen"), new DefaultPrivacyProvider(new MD5AuthenticationProvider(new OctetString("authentication"))));
            if (DESPrivacyProvider.IsSupported)
            {
                users.Add(new OctetString("privacy"), new DESPrivacyProvider(new OctetString("privacyphrase"),
                                                                             new MD5AuthenticationProvider(new OctetString("authentication"))));
            }

            if (AESPrivacyProviderBase.IsSupported)
            {
                users.Add(new OctetString("aes"), new AESPrivacyProvider(new OctetString("privacyphrase"), new MD5AuthenticationProvider(new OctetString("authentication"))));
                users.Add(new OctetString("aes192"), new AES192PrivacyProvider(new OctetString("privacyphrase"), new MD5AuthenticationProvider(new OctetString("authentication"))));
                users.Add(new OctetString("aes256"), new AES256PrivacyProvider(new OctetString("privacyphrase"), new MD5AuthenticationProvider(new OctetString("authentication"))));
            }

            var getv1 = new GetV1MessageHandler();
            var getv1Mapping = new HandlerMapping("v1", "GET", getv1);

            var setv1 = new SetV1MessageHandler();
            var setv1Mapping = new HandlerMapping("v1", "SET", setv1);

            var getnextv1 = new GetNextV1MessageHandler();
            var getnextv1Mapping = new HandlerMapping("v1", "GETNEXT", getnextv1);

            var v1 = new Version1MembershipProvider(new OctetString("public"), new OctetString("public"));

            var membership = new ComposedMembershipProvider(new IMembershipProvider[] { v1 });
            var handlerFactory = new MessageHandlerFactory(new[]
            {
                getv1Mapping,
                setv1Mapping,
                getnextv1Mapping
            });

            var pipelineFactory = new SnmpApplicationFactory(new RollingLogger(), store, membership, handlerFactory);
            _engine = new SnmpEngine(pipelineFactory, new Listener { Users = users }, new EngineGroup());
            _engine.ExceptionRaised  = (sender, e) => MessageBox.Show(e.Exception.ToString());

            InitializeComponent();

            txtIp.Text = @"162"; //port to receive snmp trap
            cmbIp.Items.Add(StrAllUnassigned);
            foreach (IPAddress address in Dns.GetHostEntry(string.Empty).AddressList.Where(address => !address.IsIPv6LinkLocal))
            {
                cmbIp.Items.Add(address);
            }
            cmbIp.SelectedIndex = 0;


        }

        public void StartListeners()
        {
            try
            {
                _engine.Listener.ClearBindings();
                int port = int.Parse(txtIp.Text, CultureInfo.InvariantCulture);
                /*
                if (cmbIp.Text == StrAllUnassigned)
                {
                    if (Socket.OSSupportsIPv4)
                    {
                        _engine.Listener.AddBinding(new IPEndPoint(IPAddress.Any, port));
                    }

                    if (Socket.OSSupportsIPv6)
                    {
                        _engine.Listener.AddBinding(new IPEndPoint(IPAddress.IPv6Any, port));
                    }

                    _engine.Start();
                    if (_engine.Active)
                    {
                        MessageBox.Show("Engine activated");
                    }
                    return;
                }
                */
                IPAddress address = IPAddress.Parse(cmbIp.Text);
                if (address.AddressFamily == AddressFamily.InterNetwork)
                {
                    if (!Socket.OSSupportsIPv4)
                    {
                        MessageBox.Show(Listener.ErrorIPv4NotSupported);
                        return;
                    }

                    _engine.Listener.AddBinding(new IPEndPoint(address, port));
                    _engine.Listener.MessageReceived  = Listener_MessageReceived;
                    _engine.Start();
                    if (_engine.Active)
                    {
                        MessageBox.Show("Engine activated");
                    }
                    return;
                }

                if (!Socket.OSSupportsIPv6)
                {
                    MessageBox.Show(Listener.ErrorIPv6NotSupported);
                    return;
                }

                _engine.Listener.AddBinding(new IPEndPoint(address, port));
                _engine.Start();

                

            }
            catch (Exception ex)
            {
                MessageBox.Show("Exception has been thrown in start: "   ex);
            }
        }

        private void Listener_MessageReceived(object sender, MessageReceivedEventArgs e)
        {
            MessageBox.Show("message received");
        }

        private void StopListeners()
        {
            _engine.Stop();
            _engine.Dispose();
        }       

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            //send trap 
            IPAddress ip = IPAddress.Parse("127.0.0.1");
            Messenger.SendTrapV1(
                new IPEndPoint(ip, 162),
                IPAddress.Loopback, // here should be IP of the current machine.
                new OctetString("public"),
                new ObjectIdentifier(new uint[] { 1, 3, 6 }),
                GenericCode.ColdStart,
                0,
                0,
                new List<Variable>());

        }

        private void Start_Click(object sender, RoutedEventArgs e)
        {            
            try
            {
                StartListeners();
            }
            catch (PortInUseException ex)
            {
                MessageBox.Show(@"Port is already in use: "   ex.Endpoint, @"Error");
            }
        }

        private void stop_Click(object sender, RoutedEventArgs e)
        {
            if (_engine.Active)
            {
                try
                {
                    _engine.Listener.MessageReceived -= Listener_MessageReceived;
                    StopListeners();
                }
                catch (Exception ex)
                {
                    MessageBox.Show("exception in stop: "   ex);
                }
            }
        }
    }
  

Итак, чтобы получать сообщения snmp-ловушек, вы также должны отправить одно.
У меня есть текстовое поле со списком номеров портов и IP-адресом.
кнопка отправки ловушки и кнопка запуска и остановки.

Отправка ловушки работает отлично, я могу проверить в wireshark, что у меня есть snmp-пакет, однако icmp отвечает с недоступным портом, что означает, что никто не слушает.-> проблема 1

При активации движка у меня нет никаких ошибок, но в отношении icmp я проверил в cmd с помощью command: netstat -an, чтобы проверить, прослушивалось ли что-то на порту 162, но не повезло.

Как я могу проверить, что движок работает и / или что-то прослушивается? Я подписался на событие message_received, но я не получаю ничего, что могло бы привести к тому, что никто не слушает.

И последнее, но не менее важное, когда я нажимаю кнопку stop, я получаю исключение socketexception, но не получаю ни одного из моих собственных сообщений из циклов try catch -> Должен ли я предполагать, что это в пакете?

Как решить эту проблему. Я хочу просто получать сообщения snmpv1 trap и пока хранить их в datatable.

Комментарии:

1. Самый простой способ — добавить таймер и остановить таймер в Listener_MessageReceived. Затем, если таймер истечет, у вас появится ошибка, о которой вы можете сообщить.

2. Вы должны проверять snmptrapd, а не snmpd.

3. @lexLi в этой папке нет файла программы, только файл .config, папка свойств и файл cproj, но нет и файла program.cs, например.

4. Пожалуйста, клонируйте репозиторий и откройте файл решения в Visual Studio. Пустая трата времени, если вы поступите иначе.