static void Main(string[] args) { var community = new OctetString("public"); var request = new GetRequestMessage(2, VersionCode.V1, community, new List <Variable> { new Variable(new ObjectIdentifier("0.0")) }); var registry = new UserRegistry(); var socket = new Socket(SocketType.Dgram, ProtocolType.Udp); var dest = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 161); Console.WriteLine("snapshot 1"); Console.ReadKey(); Console.WriteLine("started"); Task.Run(async() => { for (int index = 0; index < 1000000; index++) { var response = await request.GetResponseAsync( dest, registry, socket); Console.WriteLine(response.Scope.Pdu.ErrorStatus); } }); Console.WriteLine("snapshot 2"); Console.ReadKey(); }
public async Task TestResponseAsync() { var engine = CreateEngine(); engine.Listener.ClearBindings(); var serverEndPoint = new IPEndPoint(IPAddress.Loopback, Port.NextId); engine.Listener.AddBinding(serverEndPoint); engine.Start(); try { Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); GetRequestMessage message = new GetRequestMessage(0x4bed, VersionCode.V2, new OctetString("public"), new List <Variable> { new Variable(new ObjectIdentifier("1.3.6.1.2.1.1.1.0")) }); var users1 = new UserRegistry(); var response = await message.GetResponseAsync(serverEndPoint, users1, socket); Assert.Equal(SnmpType.ResponsePdu, response.TypeCode()); } finally { if (SnmpMessageExtension.IsRunningOnWindows) { engine.Stop(); } } }
public async void TestResponsesFromMultipleSources() { var start = 16102; var end = start + 512; var engine = CreateEngine(); engine.Listener.ClearBindings(); for (var index = start; index < end; index++) { engine.Listener.AddBinding(new IPEndPoint(IPAddress.Loopback, index)); } // IMPORTANT: need to set min thread count so as to boost performance. int minWorker, minIOC; // Get the current settings. ThreadPool.GetMinThreads(out minWorker, out minIOC); var threads = engine.Listener.Bindings.Count; ThreadPool.SetMinThreads(threads + 1, minIOC); var time = DateTime.Now; engine.Start(); Console.WriteLine(DateTime.Now - time); const int timeout = 100000; for (int index = start; index < end; index++) //Parallel.For(start, end, async index => { GetRequestMessage message = new GetRequestMessage(index, VersionCode.V2, new OctetString("public"), new List <Variable> { new Variable(new ObjectIdentifier("1.3.6.1.2.1.1.1.0")) }); Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); Stopwatch watch = new Stopwatch(); watch.Start(); Console.WriteLine("manager [{0}]{1}", Thread.CurrentThread.ManagedThreadId, DateTime.UtcNow); //var response = message.GetResponse(timeout, new IPEndPoint(IPAddress.Loopback, index), socket); var response = await message.GetResponseAsync(new IPEndPoint(IPAddress.Loopback, index), new UserRegistry(), socket); Console.WriteLine("manager [{0}]{1}", Thread.CurrentThread.ManagedThreadId, DateTime.UtcNow); watch.Stop(); Console.WriteLine("manager {0}: {1}: port {2}", index, watch.Elapsed, ((IPEndPoint)socket.LocalEndPoint).Port); Assert.AreEqual(index, response.RequestId()); } // ); engine.Stop(); }
public async Task <OID> Handle(GetV3Query query) { var discovery = Messenger.GetNextDiscovery(SnmpType.GetRequestPdu); var report = discovery.GetResponse(10000, new IPEndPoint(query.IpAddress, query.Port)); IPrivacyProvider provider; if (query.EncryptionType == EncryptionType.DES) { provider = new Security.DESPrivacyProvider( new OctetString(query.Encryption), new MD5AuthenticationProvider(new OctetString(query.Password))); } else { provider = new Security.AESPrivacyProvider( new OctetString(query.Encryption), new MD5AuthenticationProvider(new OctetString(query.Password))); } var request = new GetRequestMessage( Lextm.SharpSnmpLib.VersionCode.V3, Messenger.NextMessageId, Messenger.NextRequestId, new OctetString(query.UserName), new List <Variable> { new Variable(new ObjectIdentifier(query.OID_Id)) }, provider, Messenger.MaxMessageSize, report); var reply = await request.GetResponseAsync(new IPEndPoint(query.IpAddress, query.Port)); var oid = reply .Pdu().Variables .FirstOrDefault(variable => variable.Id.ToString() == query.OID_Id); if (oid == null) { throw new KeyNotFoundException($"Cannot find variable with ID {query.OID_Id}"); } if (reply.Pdu().ErrorStatus.ToInt32() != 0) // != ErrorCode.NoError { throw ErrorException.Create("error in response", query.IpAddress, reply); } return(new OID { Id = oid.Id.ToString(), Value = oid.Data.ToString() }); }
public async Task TestResponsesFromMultipleSources(int count) { var start = 16102; var end = start + count; var engine = CreateEngine(); engine.Listener.ClearBindings(); for (var index = start; index < end; index++) { engine.Listener.AddBinding(new IPEndPoint(IPAddress.Loopback, index)); } #if NET452 // IMPORTANT: need to set min thread count so as to boost performance. int minWorker, minIOC; // Get the current settings. ThreadPool.GetMinThreads(out minWorker, out minIOC); var threads = engine.Listener.Bindings.Count; ThreadPool.SetMinThreads(threads + 1, minIOC); #endif engine.Start(); try { for (int index = start; index < end; index++) { GetRequestMessage message = new GetRequestMessage(index, VersionCode.V2, new OctetString("public"), new List <Variable> { new Variable(new ObjectIdentifier("1.3.6.1.2.1.1.1.0")) }); Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); Stopwatch watch = new Stopwatch(); watch.Start(); var response = await message.GetResponseAsync(new IPEndPoint(IPAddress.Loopback, index), new UserRegistry(), socket); watch.Stop(); Assert.Equal(index, response.RequestId()); } } finally { if (SnmpMessageExtension.IsRunningOnWindows) { engine.Stop(); } } }
public async Task TestResponsesFromSingleSource(int count) { var start = 0; var end = start + count; var engine = CreateEngine(); engine.Listener.ClearBindings(); var serverEndPoint = new IPEndPoint(IPAddress.Loopback, Port.NextId); engine.Listener.AddBinding(serverEndPoint); //// IMPORTANT: need to set min thread count so as to boost performance. //int minWorker, minIOC; //// Get the current settings. //ThreadPool.GetMinThreads(out minWorker, out minIOC); //var threads = engine.Listener.Bindings.Count; //ThreadPool.SetMinThreads(threads + 1, minIOC); engine.Start(); try { Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); for (int index = start; index < end; index++) { GetRequestMessage message = new GetRequestMessage(0, VersionCode.V2, new OctetString(communityPublic), new List <Variable> { new Variable(new ObjectIdentifier(oidIdentifier)) }); Stopwatch watch = new Stopwatch(); watch.Start(); var response = await message.GetResponseAsync(serverEndPoint, new UserRegistry(), socket); watch.Stop(); Assert.Equal(0, response.RequestId()); } } catch (Exception) { Console.WriteLine(serverEndPoint.Port); } finally { if (SnmpMessageExtension.IsRunningOnWindows) { engine.Stop(); } } }
public async Task TestResponsesFromSingleSource(int count) { var start = 0; var end = start + count; var engine = CreateEngine(); engine.Listener.ClearBindings(); var serverEndPoint = new IPEndPoint(IPAddress.Loopback, port.NextId); engine.Listener.AddBinding(serverEndPoint); //// IMPORTANT: need to set min thread count so as to boost performance. //int minWorker, minIOC; //// Get the current settings. //ThreadPool.GetMinThreads(out minWorker, out minIOC); //var threads = engine.Listener.Bindings.Count; //ThreadPool.SetMinThreads(threads + 1, minIOC); var time = DateTime.Now; engine.Start(); Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); for (int index = start; index < end; index++) { GetRequestMessage message = new GetRequestMessage(0, VersionCode.V2, new OctetString("public"), new List <Variable> { new Variable(new ObjectIdentifier("1.3.6.1.2.1.1.1.0")) }); Stopwatch watch = new Stopwatch(); watch.Start(); var response = await message.GetResponseAsync(serverEndPoint, new UserRegistry(), socket); watch.Stop(); Assert.Equal(0, response.RequestId()); } engine.Stop(); }
public async void TestResponsesFromSingleSource() { var start = 0; var end = start + 32; var engine = CreateEngine(); engine.Listener.ClearBindings(); engine.Listener.AddBinding(new IPEndPoint(IPAddress.Loopback, 17000)); //// IMPORTANT: need to set min thread count so as to boost performance. //int minWorker, minIOC; //// Get the current settings. //ThreadPool.GetMinThreads(out minWorker, out minIOC); //var threads = engine.Listener.Bindings.Count; //ThreadPool.SetMinThreads(threads + 1, minIOC); var time = DateTime.Now; engine.Start(); Console.WriteLine(DateTime.Now - time); const int timeout = 100000; Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); for (int index = start; index < end; index++) //Parallel.For(start, end, async index => { GetRequestMessage message = new GetRequestMessage(0, VersionCode.V2, new OctetString("public"), new List<Variable> { new Variable(new ObjectIdentifier("1.3.6.1.2.1.1.1.0")) }); Stopwatch watch = new Stopwatch(); watch.Start(); Console.WriteLine("manager [{0}]{1}", Thread.CurrentThread.ManagedThreadId, DateTime.UtcNow); //var response = message.GetResponse(timeout, new IPEndPoint(IPAddress.Loopback, 17000), socket); var response = await message.GetResponseAsync(new IPEndPoint(IPAddress.Loopback, 17000), new UserRegistry(), socket); Console.WriteLine("manager [{0}]{1}", Thread.CurrentThread.ManagedThreadId, DateTime.UtcNow); watch.Stop(); Console.WriteLine("manager {0}: {1}: port {2}", index, watch.Elapsed, ((IPEndPoint)socket.LocalEndPoint).Port); Assert.AreEqual(0, response.RequestId()); } // ); engine.Stop(); }
public async Task TestResponseAsync() { var engine = CreateEngine(); engine.Listener.ClearBindings(); engine.Listener.AddBinding(new IPEndPoint(IPAddress.Loopback, 16100)); engine.Start(); Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); GetRequestMessage message = new GetRequestMessage(0x4bed, VersionCode.V2, new OctetString("public"), new List<Variable> { new Variable(new ObjectIdentifier("1.3.6.1.2.1.1.1.0")) }); var users1 = new UserRegistry(); var response = await message.GetResponseAsync(new IPEndPoint(IPAddress.Loopback, 16100), users1, socket); engine.Stop(); Assert.AreEqual(SnmpType.ResponsePdu, response.TypeCode()); }
public async Task <Variable?> GetV3UsmAsync(IPAddress ip, string oid, string community, int retries, int port, TimeSpan timeout, string authPass, string privPass) { if (ip == null) { throw new ArgumentNullException(nameof(ip)); } if (string.IsNullOrWhiteSpace(oid)) { throw new ArgumentNullException(nameof(oid)); } if (!Regex.IsMatch(oid, @"^(([0-9]+)\.)+[0-9]+$")) { throw new ArgumentException(oid, nameof(oid)); } if (port <= 0) { throw new ArgumentOutOfRangeException(nameof(port), port.ToString()); } if (retries <= 0) { throw new ArgumentOutOfRangeException(nameof(retries), retries.ToString()); } if (timeout <= TimeSpan.Zero) { throw new ArgumentOutOfRangeException(nameof(timeout), timeout.ToString()); } if (string.IsNullOrWhiteSpace(authPass)) { throw new ArgumentNullException(nameof(authPass)); } if (string.IsNullOrWhiteSpace(privPass)) { throw new ArgumentNullException(nameof(privPass)); } var startDate = DateTime.Now; var snmpType = "GET"; var snmpVersion = $"3 {SecurityModel.Usm}"; var attempt = 0; IEnumerable <Variable> reply = new List <Variable>(); while (attempt < retries) { try { var receiver = new IPEndPoint(ip, port); var clientEndPoint = ip.AddressFamily == AddressFamily.InterNetwork ? new IPEndPoint(IPAddress.Any, 0) : new IPEndPoint(IPAddress.IPv6Any, 0); var vList = new List <Variable>() { new Variable(new ObjectIdentifier(oid)) }; using var cts = new CancellationTokenSource(timeout); var discovery = Messenger.GetNextDiscovery(SnmpType.GetRequestPdu); var report = await discovery.GetResponseAsync(receiver).ConfigureAwait(false); var auth = new SHA1AuthenticationProvider(new OctetString(authPass)); // AuthenticationPassword var priv = new DESPrivacyProvider(new OctetString(privPass), auth); //PrivacyPassword var request = new GetRequestMessage(VersionCode.V3, Messenger.NextMessageId, Messenger.NextRequestId, new OctetString(community), vList, priv, Messenger.MaxMessageSize, report); ISnmpMessage response = await request.GetResponseAsync(receiver, cts.Token).ConfigureAwait(false); if (response is ReportMessage) { if (response.Pdu().Variables.Count == 0) { throw new Exception("wrong report message received"); } var id = response.Pdu().Variables[0].Id; if (id != Messenger.NotInTimeWindow) { var error = id.GetErrorMessage(); throw new Exception($"ERROR: {error}"); } } else if (response.Pdu().ErrorStatus.ToInt32() != 0) // != ErrorCode.NoError { throw ErrorException.Create( "error in response", receiver.Address, response); } reply = response.Pdu().Variables; break; } catch (Exception ex) when(ex is SnmpException || ex is SocketException || ex is OperationCanceledException || ex is System.TimeoutException) { if (ex is System.TimeoutException && ex.Message == "Could Not Connect To Server") { _Logger.LogInformation($"{ip} - DTLS failed {attempt + 1} time(s)"); } await _SnmpLog.LogTransactionAsync(startDate, ip.ToString(), oid, community, snmpType, snmpVersion, ex.GetType().ToString(), ex.Message).ConfigureAwait(false); ++attempt; if (attempt >= retries) { throw; } } } var type = string.Empty; var data = string.Empty; foreach (var res in reply) { type += res.Data.TypeCode; data += res.Data.ToString(); } await _SnmpLog.LogTransactionAsync(startDate, ip.ToString(), oid, community, snmpType, snmpVersion, type, data).ConfigureAwait(false); return(reply.FirstOrDefault()); }