如何解决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 举报,一经查实,本站将立刻删除。