C# snmp陷阱侦听器无消息接收
因此,我正在构建一个snmp陷阱接收器来接收snmp陷阱消息。 我正在使用lexstudios的sharpsnmp网络包以及github的带有pipline的sample.engine。 我正在创建一个简单的wpf应用程序,以便在屏幕上显示消息,以便在.NET4.7.1中进行测试 所以对于听力部分,我大致使用了示例snmpdC# snmp陷阱侦听器无消息接收,c#,snmp-trap,sharp-snmp,.net-4.7.1,snmpsharpnet,C#,Snmp Trap,Sharp Snmp,.net 4.7.1,Snmpsharpnet,因此,我正在构建一个snmp陷阱接收器来接收snmp陷阱消息。 我正在使用lexstudios的sharpsnmp网络包以及github的带有pipline的sample.engine。 我正在创建一个简单的wpf应用程序,以便在屏幕上显示消息,以便在.NET4.7.1中进行测试 所以对于听力部分,我大致使用了示例snmpd public partial class MainWindow : Window { private SnmpEngine _engine;
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);
}
}
}
}
公共部分类主窗口:窗口
{
私人发动机;
private const string StrAllUnassigned=“All Unassigned”;
公共主窗口()
{
var store=new ObjectStore();
Add(新的SysDescr());
Add(新的SysObjectId());
添加(新系统正常运行时间());
添加(新的SysContact());
添加(新的SysName());
添加(新的SysLocation());
添加(新的SysServices());
Add(newsysorlastchange());
Add(newsysortable());
添加(新的IfNumber());
store.Add(新的IfTable());
var users=new UserRegistry();
Add(新的八位字符串(“两者”),DefaultPrivacyProvider.DefaultPair);
Add(新八位字符串(“authen”)、新DefaultPrivacyProvider(新MD5AuthenticationProvider(新八位字符串(“authentication”)));
如果(DesprivacProvider.Isupported)
{
添加(新的八位字符串(“隐私”)、新的DesprivacProvider(新的八位字符串(“隐私短语”),
新的MD5AuthenticationProvider(新的八位字符串(“身份验证”));
}
if(AESPrivacyProviderBase.IsSupported)
{
添加(新的八位字符串(“aes”)、新的AESPrivacyProvider(新的八位字符串(“PrivacyPhase”)、新的MD5AuthenticationProvider(新的八位字符串(“身份验证”));
添加(新八位字符串(“aes192”)、新AES192PrivacyProvider(新八位字符串(“PrivacyPhase”)、新MD5AuthenticationProvider(新八位字符串(“身份验证”));
添加(新八位字符串(“aes256”)、新AES256PrivacyProvider(新八位字符串(“PrivacyPhase”)、新MD5AuthenticationProvider(新八位字符串(“身份验证”));
}
var getv1=新的GetV1MessageHandler();
var getv1Mapping=newhandlermapping(“v1”,“GET”,getv1);
var setv1=新的SetV1MessageHandler();
var setv1Mapping=新的HandlerMapping(“v1”,“SET”,setv1);
var getnextv1=new GetNextV1MessageHandler();
var getnextv1Mapping=新的HandlerMapping(“v1”,“GETNEXT”,getnextv1);
var v1=新版本1MembershipProvider(新的八位字符串(“public”)、新的八位字符串(“public”);
var membership=new ComposedMembershipProvider(new IMembershipProvider[]{v1});
var handlerFactory=newmessagehandlerfactory(new[]
{
getv1映射,
setv1映射,
GetNextV1映射
});
var pipelineFactory=new SnmpApplicationFactory(new RollingLogger(),store,membership,handlerFactory);
_engine=new SnmpEngine(pipelineFactory,新侦听器{Users=Users},新EngineGroup());
_engine.ExceptionRaised+=(发送方,e)=>MessageBox.Show(e.Exception.ToString());
初始化组件();
Text=@“162”//用于接收snmp陷阱的端口
cmbIp.项目.添加(StrAllUnassigned);
foreach(Dns.GetHostEntry(string.Empty).AddressList.Where(address=>!address.IsIPv6LinkLocal)中的IP地址)
{
cmbIp.项目.添加(地址);
}
cmbIp.SelectedIndex=0;
}
公共侦听器()
{
尝试
{
_engine.Listener.ClearBindings();
int port=int.Parse(txtIp.Text,CultureInfo.InvariantCulture);
/*
if(cmbIp.Text==StrAllUnassigned)
{
if(Socket.OSSupportsIPv4)
{
_engine.Listener.AddBinding(新的IPEndPoint(IPAddress.Any,port));
}
if(套接字.OSSupportsIPv6)
{
_engine.Listener.AddBinding(新的IPEndPoint(IPAddress.IPv6Any,port));
}
_发动机起动();
如果(_engine.Active)
{
MessageBox.Show(“引擎已激活”);
}
返回;
}
*/
IPAddress address=IPAddress.Parse(cmbIp.Text);
if(address.AddressFamily==AddressFamily.InterNetwork)
{
如果(!Socket.OSSupportsIPv4)
{
MessageBox.Show(Listener.ErrorIPv4NotSupported);
返回;
}
_engine.Listener.AddBinding(新的IPEndPoint(地址、端口));
_engine.Listener.MessageReceived+=侦听器_MessageReceived;
_发动机起动();
如果(_engine.Active)
{
MessageBox.Show(“引擎已激活”);
}
返回;
}
如果(!Socket.OSSupportsIPv6)
{
MessageBox.Show(Listener.ErrorIPv6NotSupported);
返回;
}
_engine.Listener.AddBinding(新的IPEndPoint(地址、端口));
_发动机起动();
}
捕获(例外情况除外)
{
Show(“在start:+ex中引发了异常”);
}
}
private void Listener_MessageReceived(对象发送方,MessageReceivedEventArgs e)
{