snmp陷阱监听器没有收到消息

问题描述

因此,我正在构建一个snmp trap接收器以接收snmp trap消息。 我正在使用lexstudios的sharpsnmp-net包以及github上的pipline的sample.engine。 我正在创建一个简单的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,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地址的端口号组合框的文本框。 发送陷阱按钮以及开始和停止按钮。

发送陷阱的操作非常完美,我可以在Wireshk中验证我确实有一个snmp数据包,但是icmp回答端口不可达,这意味着没有人在监听。->问题1

启动引擎时,我没有任何错误,但是关于icmp,我使用以下命令在cmd中进行了检查:netstat -an来检查端口162上是否监听了某些内容,但运气不好。

我如何验证引擎是否在工作或者是否正在监听? 我订阅了message_received事件,但没有收到任何可能导致没有人在听的事实。

最后但并非最不重要的一点是,当我按下停止按钮时,我确实获得了一个socketexception,但是没有从try catch循环中收到我自己的任何消息->我是否应该认为这在包装中?

如何解决此问题。我只想接收snmpv1陷阱消息并将它们存储到到目前为止的数据表中。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...