public void TestTimeOut() { // IMPORTANT: this test case requires a local SNMP agent such as // #SNMP Agent (snmpd), // Windows SNMP agent service, // Net-SNMP agent, or // snmp4j agent. 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")) }); const int time = 1500; bool hasException = false; try { message.GetResponse(time, new IPEndPoint(IPAddress.Loopback, 161), socket); } catch (TimeoutException) { hasException = true; } Assert.IsFalse(hasException); System.Diagnostics.Stopwatch timer = new System.Diagnostics.Stopwatch(); try { timer.Start(); //IMPORTANT: test against an agent that doesn't exist. // ReSharper disable AssignNullToNotNullAttribute message.GetResponse(time, new IPEndPoint(IPAddress.Parse("192.168.0.233"), 161), socket); // ReSharper restore AssignNullToNotNullAttribute } catch (TimeoutException) { hasException = true; } timer.Stop(); long elapsedMilliseconds = timer.ElapsedMilliseconds; Console.WriteLine(@"elapsed: " + elapsedMilliseconds); Console.WriteLine(@"timeout: " + time); Assert.LessOrEqual(time, elapsedMilliseconds); Assert.IsTrue(hasException); // FIXME: these values are valid on my machine openSUSE 11.2. (lex) // This test case usually fails on Windows, as strangely WinSock API call adds an extra 500-ms. if (SnmpMessageExtension.IsRunningOnMono) { Assert.LessOrEqual(elapsedMilliseconds, time + 100); } }
public void TestLargeMessage() { 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); var list = new List <Variable>(); for (int i = 0; i < 1000; i++) { list.Add(new Variable(new ObjectIdentifier("1.3.6.1.1.1.0"))); } GetRequestMessage message = new GetRequestMessage( 0x4bed, VersionCode.V2, new OctetString("public"), list); Assert.True(message.ToBytes().Length > 10000); var time = 3000; if (SnmpMessageExtension.IsRunningOnMac) { var exception = Assert.Throws <SocketException>(() => message.GetResponse(time, serverEndPoint, socket)); Assert.Equal(SocketError.MessageSize, exception.SocketErrorCode); } else { // IMPORTANT: test against an agent that doesn't exist. var result = message.GetResponse(time, serverEndPoint, socket); Assert.True(result.Scope.Pdu.ErrorStatus.ToErrorCode() == ErrorCode.NoError); } } finally { if (SnmpMessageExtension.IsRunningOnWindows) { engine.Stop(); } } }
public void TestTimeOut() { using (var engine = CreateEngine()) { engine.Listener.ClearBindings(); var serverEndPoint = new IPEndPoint(IPAddress.Loopback, port.NextId); engine.Listener.AddBinding(serverEndPoint); 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.5.2")) }); const int time = 1500; var timer = new Stopwatch(); timer.Start(); //IMPORTANT: test against an agent that doesn't exist. Assert.Throws <Messaging.TimeoutException>(() => message.GetResponse(time, serverEndPoint, socket)); timer.Stop(); long elapsedMilliseconds = timer.ElapsedMilliseconds; Assert.True(time <= elapsedMilliseconds); // FIXME: these values are valid on my machine openSUSE 11.2. (lex) // This test case usually fails on Windows, as strangely WinSock API call adds an extra 500-ms. if (SnmpMessageExtension.IsRunningOnMono) { Assert.True(elapsedMilliseconds <= time + 100); } } }
public void TestLargeMessage() { using (var engine = CreateEngine()) { engine.Listener.ClearBindings(); var serverEndPoint = new IPEndPoint(IPAddress.Loopback, port.NextId); engine.Listener.AddBinding(serverEndPoint); engine.Start(); Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); var list = new List <Variable>(); for (int i = 0; i < 1000; i++) { list.Add(new Variable(new ObjectIdentifier("1.3.6.1.1.1.0"))); } GetRequestMessage message = new GetRequestMessage( 0x4bed, VersionCode.V2, new OctetString("public"), list); Assert.True(message.ToBytes().Length > 10000); var time = 1500; //IMPORTANT: test against an agent that doesn't exist. var result = message.GetResponse(time, serverEndPoint, socket); Assert.True(result.Scope.Pdu.ErrorStatus.ToErrorCode() == ErrorCode.NoError); } }
public void TestWrongCommunityV12() { 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); var identifier = new Variable(new ObjectIdentifier(oidIdentifier)); GetRequestMessage message = new GetRequestMessage(0x4bed, VersionCode.V2, new OctetString("public2"), new List <Variable> { identifier }); Assert.Throws <Messaging.TimeoutException>(() => message.GetResponse(1500, serverEndPoint, socket)); } finally { if (SnmpMessageExtension.IsRunningOnWindows) { engine.Stop(); } } }
public void TestTimeOut() { 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")) }); const int time = 1500; var timer = new Stopwatch(); timer.Start(); //IMPORTANT: test against an agent that doesn't exist. Assert.Throws <TimeoutException>(() => message.GetResponse(time, new IPEndPoint(IPAddress.Parse("8.8.8.8"), 161), socket)); timer.Stop(); long elapsedMilliseconds = timer.ElapsedMilliseconds; Console.WriteLine(@"elapsed: " + elapsedMilliseconds); Console.WriteLine(@"timeout: " + time); Assert.True(time <= elapsedMilliseconds); // FIXME: these values are valid on my machine openSUSE 11.2. (lex) // This test case usually fails on Windows, as strangely WinSock API call adds an extra 500-ms. if (SnmpMessageExtension.IsRunningOnMono) { Assert.True(elapsedMilliseconds <= time + 100); } }
internal override void Get(Variable variable) { if (string.IsNullOrEmpty(UserName)) { Logger.Info("User name need to be specified for v3."); return; } Discovery discovery = Messenger.NextDiscovery; ReportMessage report = discovery.GetResponse(Timeout, Agent); GetRequestMessage request = new GetRequestMessage(VersionCode.V3, Messenger.NextMessageId, Messenger.NextRequestId, new OctetString(UserName), new List <Variable> { variable }, _privacy, Messenger.MaxMessageSize, report); ISnmpMessage response = request.GetResponse(Timeout, Agent, _registry); if (response.Pdu().ErrorStatus.ToInt32() != 0) { throw ErrorException.Create( "error in response", Agent.Address, response); } Logger.Info(response.Pdu().Variables[0].ToString(Objects)); }
public void TestResponse() { 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")) }); const int time = 1500; var response = message.GetResponse(time, serverEndPoint, socket); Assert.Equal(0x4bed, response.RequestId()); } finally { if (SnmpMessageExtension.IsRunningOnWindows) { engine.Stop(); } } }
/// <summary> /// Returns a list of OID values as Variable's. /// </summary> /// <param name="requestedVariables"></param> /// <returns></returns> public List <Variable> GetOidValues(List <Variable> requestedVariables) { List <Variable> oidResults; try { // SNMPv2 if (snmpVersion != VersionCode.V3) { oidResults = new List <Variable>(Messenger.Get(snmpVersion, snmpEndpoint, snmpCommunity, requestedVariables, snmpTimeout)); } // SNMPv3 else { Discovery snmpDiscovery = Messenger.NextDiscovery; ReportMessage snmpRepMsg = snmpDiscovery.GetResponse(snmpTimeout, snmpEndpoint); GetRequestMessage snmpRequest = new GetRequestMessage(snmpVersion, Messenger.NextMessageId, Messenger.NextRequestId, snmpUser, requestedVariables, snmpPriv, Messenger.MaxMessageSize, snmpRepMsg); ISnmpMessage snmpRespMsg = snmpRequest.GetResponse(snmpTimeout, snmpEndpoint); if (snmpRespMsg.Pdu().ErrorStatus.ToInt32() != 0) { throw Lextm.SharpSnmpLib.Messaging.ErrorException.Create("Error in SNMP Response, ", snmpEndpoint.Address, snmpRespMsg); } oidResults = new List <Variable>(snmpRespMsg.Pdu().Variables); } } catch (Exception) { throw; } return(oidResults); }
/// <summary> /// Get specifico per la V3 /// ToDo: testare! /// </summary> /// <param name="objectId">Id oggetto</param> /// <returns>SNMP message</returns> private ISnmpMessage GetMessageV3(string objectId) { return(null); ErrorString = ""; //Discover Discovery discovery = Messenger.GetNextDiscovery(SnmpType.GetRequestPdu); ReportMessage report; try { report = discovery.GetResponse(10000, new IPEndPoint(IpRequestManager, IpRequestPORT)); } catch (Exception ex) { ErrorString = String.Format("Message: {0}\r\nSource: {1}\r\nStackTrace:{2}", ex.Message, ex.Source, ex.StackTrace); return(null); } GetRequestMessage request = new GetRequestMessage( VersionCode, Messenger.NextMessageId, Messenger.NextRequestId, UName, new List <Variable> { new Variable(new ObjectIdentifier(objectId)) }, Priv, Messenger.MaxMessageSize, report); ISnmpMessage reply; try { reply = request.GetResponse(10000, new IPEndPoint(IpRequestManager, IpRequestPORT)); } catch (Exception ex) { ErrorString = String.Format("Message: {0}\r\nSource: {1}\r\nStackTrace:{2}", ex.Message, ex.Source, ex.StackTrace); return(null); } //if (reply.Pdu().ErrorStatus.ToInt32() != 0) // != ErrorCode.NoError //{ // throw ErrorException.Create( // "error in response", // IpRequestManager, // reply); //} return(reply); }
public void TestResponseVersion3() { var engine = CreateEngine(); engine.Listener.ClearBindings(); var serverEndPoint = new IPEndPoint(IPAddress.Loopback, Port.NextId); engine.Listener.AddBinding(serverEndPoint); engine.Start(); try { IAuthenticationProvider auth = new MD5AuthenticationProvider(new OctetString("authentication")); IPrivacyProvider priv = new DefaultPrivacyProvider(auth); var ending = new AutoResetEvent(false); var timeout = 3000; Discovery discovery = Messenger.GetNextDiscovery(SnmpType.GetRequestPdu); ReportMessage report = discovery.GetResponse(timeout, serverEndPoint); var expected = Messenger.NextRequestId; GetRequestMessage request = new GetRequestMessage(VersionCode.V3, Messenger.NextMessageId, expected, new OctetString("authen"), OctetString.Empty, new List <Variable> { new Variable(new ObjectIdentifier("1.3.6.1.2.1.1.1.0")) }, priv, Messenger.MaxMessageSize, report); var source = Observable.Defer(() => { ISnmpMessage reply = request.GetResponse(timeout, serverEndPoint); return(Observable.Return(reply)); }) .RetryWithBackoffStrategy( retryCount: 4, retryOnError: e => e is Messaging.TimeoutException ); source.Subscribe(reply => { ISnmpPdu snmpPdu = reply.Pdu(); Assert.Equal(SnmpType.ResponsePdu, snmpPdu.TypeCode); Assert.Equal(expected, reply.RequestId()); Assert.Equal(ErrorCode.NoError, snmpPdu.ErrorStatus.ToErrorCode()); ending.Set(); }); Assert.True(ending.WaitOne(MaxTimeout)); } finally { if (SnmpMessageExtension.IsRunningOnWindows) { engine.Stop(); } } }
public void TestResponsesFromSingleSourceWithMultipleThreads(int count) { var start = 0; var end = start + count; 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 = 10000; // Uncomment below to reveal wrong sequence number issue. // Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); //for (int index = start; index < end; index++) Parallel.For(start, 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")) }); // Comment below to reveal wrong sequence number issue. 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, 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.Equal(index, response.RequestId()); } ); engine.Stop(); }
public void TestResponsesFromSingleSourceWithMultipleThreads(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); #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 { const int timeout = 10000; // Uncomment below to reveal wrong sequence number issue. // Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); Parallel.For(start, 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")) }); // Comment below to reveal wrong sequence number issue. Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); Stopwatch watch = new Stopwatch(); watch.Start(); var response = message.GetResponse(timeout, serverEndPoint, socket); watch.Stop(); Assert.Equal(index, response.RequestId()); } ); } finally { if (SnmpMessageExtension.IsRunningOnWindows) { engine.Stop(); } } }
public void Getv3Async(IPAddress ipAddress, string oid, SNMPV3Security security, string username, SNMPV3AuthenticationProvider authProvider, SecureString auth, SNMPV3PrivacyProvider privProvider, SecureString priv) { Task.Run(() => { try { var ipEndpoint = new IPEndPoint(ipAddress, Port); // Discovery var discovery = Messenger.GetNextDiscovery(SnmpType.GetRequestPdu); var report = discovery.GetResponse(Timeout, ipEndpoint); IPrivacyProvider privacy; switch (security) { case SNMPV3Security.AuthPriv: privacy = GetPrivacy(authProvider, SecureStringHelper.ConvertToString(auth), privProvider, SecureStringHelper.ConvertToString(priv)); break; // noAuthNoPriv case SNMPV3Security.AuthNoPriv: privacy = GetPrivacy(authProvider, SecureStringHelper.ConvertToString(auth)); break; default: privacy = GetPrivacy(); break; } var request = new GetRequestMessage(VersionCode.V3, Messenger.NextMessageId, Messenger.NextRequestId, new OctetString(username), new List <Variable> { new Variable(new ObjectIdentifier(oid)) }, privacy, Messenger.MaxMessageSize, report); var reply = request.GetResponse(Timeout, ipEndpoint); var result = reply.Pdu().Variables[0]; OnReceived(new SNMPReceivedArgs(result.Id, result.Data)); OnComplete(); } catch (Lextm.SharpSnmpLib.Messaging.TimeoutException) { OnTimeoutReached(); } catch (ErrorException) { OnError(); } }); }
public void Getv3Async(IPAddress ipAddress, string oid, SNMPv3Security security, string username, SNMPv3AuthenticationProvider authProvider, string auth, SNMPv3PrivacyProvider privProvider, string priv, SNMPOptions options) { Task.Run(() => { try { IPEndPoint ipEndpoint = new IPEndPoint(ipAddress, options.Port); // Discovery Discovery discovery = Messenger.GetNextDiscovery(SnmpType.GetRequestPdu); ReportMessage report = discovery.GetResponse(options.Timeout, ipEndpoint); IPrivacyProvider privacy; if (security == SNMPv3Security.authPriv) { privacy = GetPrivacy(authProvider, auth, privProvider, priv); } else if (security == SNMPv3Security.authNoPriv) { privacy = GetPrivacy(authProvider, auth); } else // noAuthNoPriv { privacy = GetPrivacy(); } GetRequestMessage request = new GetRequestMessage(VersionCode.V3, Messenger.NextMessageId, Messenger.NextRequestId, new OctetString(username), new List <Variable> { new Variable(new ObjectIdentifier(oid)) }, privacy, Messenger.MaxMessageSize, report); ISnmpMessage reply = request.GetResponse(options.Timeout, ipEndpoint); Variable result = reply.Pdu().Variables[0]; OnReceived(new SNMPReceivedArgs(result.Id, result.Data)); OnComplete(); } catch (Lextm.SharpSnmpLib.Messaging.TimeoutException) { OnTimeout(); } catch (ErrorException) { OnError(); } }); }
private ISnmpMessage DoQuery(string OID) { Discovery discovery = Messenger.GetNextDiscovery(SnmpType.GetRequestPdu); ReportMessage report = discovery.GetResponse(5000, new IPEndPoint(IPAddress.Parse(ConnectionOptions.SNMPHost), 161)); GetRequestMessage request = new GetRequestMessage(VersionCode.V3, Messenger.NextMessageId, Messenger.NextRequestId, new OctetString(ConnectionOptions.SNMPUser), new List <Variable> { new Variable(new ObjectIdentifier(OID)) }, ConnectionOptions.PrivacyProvider, Messenger.MaxMessageSize, report); ISnmpMessage reply = request.GetResponse(5000, new IPEndPoint(IPAddress.Parse(ConnectionOptions.SNMPHost), Convert.ToInt32(ConnectionOptions.SNMPPort))); if (reply.Pdu().ErrorStatus.ToInt32() != 0) // != ErrorCode.NoError { throw ErrorException.Create( "error in response", IPAddress.Parse(ConnectionOptions.SNMPHost), reply); } return(reply); }
internal override string GetValue(Variable variable) { Discovery discovery = Messenger.NextDiscovery; ReportMessage report = discovery.GetResponse(Timeout, Agent); GetRequestMessage request = new GetRequestMessage(VersionCode.V3, Messenger.NextMessageId, Messenger.NextRequestId, new OctetString(UserName), new List <Variable> { variable }, _privacy, Messenger.MaxMessageSize, report); ISnmpMessage response = request.GetResponse(Timeout, Agent, _registry); if (response.Pdu().ErrorStatus.ToInt32() != 0) { throw ErrorException.Create( "error in response", Agent.Address, response); } return(response.Pdu().Variables[0].Data.ToString()); }
public void TestResponse() { var engine = CreateEngine(); engine.Listener.ClearBindings(); engine.Listener.AddBinding(new IPEndPoint(IPAddress.Loopback, 16101)); 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")) }); const int time = 1500; var response = message.GetResponse(time, new IPEndPoint(IPAddress.Loopback, 16101), socket); Assert.Equal(0x4bed, response.RequestId()); engine.Stop(); }
string Get(string id) { GetRequestMessage request = new GetRequestMessage(Messenger.NextRequestId, VersionCode.V2, new OctetString("public"), new List <Variable> { new Variable(new ObjectIdentifier(id)) }); ISnmpMessage reply = request.GetResponse(60000, new IPEndPoint(IPAddress.Parse(LOCALHOST), 161)); if (reply.Pdu().ErrorStatus.ToInt32() != 0) // != ErrorCode.NoError { throw ErrorException.Create( "error in response", IPAddress.Parse(LOCALHOST), reply); } return(reply.Pdu().Variables[0].Data.ToString()); }
public void TestResponseVersion3_2() { var engine = CreateEngine(); engine.Listener.ClearBindings(); var serverEndPoint = new IPEndPoint(IPAddress.Loopback, Port.NextId); engine.Listener.AddBinding(serverEndPoint); engine.Start(); try { IAuthenticationProvider auth = new MD5AuthenticationProvider(new OctetString("authenticationauthentication")); IPrivacyProvider priv = new DefaultPrivacyProvider(auth); var timeout = 3000; Discovery discovery = Messenger.GetNextDiscovery(SnmpType.GetRequestPdu); ReportMessage report = discovery.GetResponse(timeout, serverEndPoint); var expected = Messenger.NextRequestId; GetRequestMessage request = new GetRequestMessage(VersionCode.V3, Messenger.NextMessageId, expected, new OctetString("authen"), OctetString.Empty, new List <Variable> { new Variable(new ObjectIdentifier("1.3.6.1.2.1.1.1.0")) }, priv, Messenger.MaxMessageSize, report); ISnmpMessage reply = request.GetResponse(timeout, serverEndPoint); ISnmpPdu snmpPdu = reply.Pdu(); Assert.Equal(SnmpType.ResponsePdu, snmpPdu.TypeCode); Assert.Equal(expected, reply.RequestId()); Assert.Equal(ErrorCode.NoError, snmpPdu.ErrorStatus.ToErrorCode()); } finally { if (SnmpMessageExtension.IsRunningOnWindows) { engine.Stop(); } } }
public void TestResponse() { var engine = CreateEngine(); engine.Listener.ClearBindings(); engine.Listener.AddBinding(new IPEndPoint(IPAddress.Loopback, 16101)); 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")) }); const int time = 1500; var response = message.GetResponse(time, new IPEndPoint(IPAddress.Loopback, 16101), socket); Assert.AreEqual(0x4bed, response.RequestId()); engine.Stop(); }
public void TestResponsesFromSingleSourceWithMultipleThreads(int count) { var ending = new AutoResetEvent(false); var source = Observable.Defer(() => { 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); #if NET46 // 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 { const int timeout = 10000; // Uncomment below to reveal wrong sequence number issue. // Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); Parallel.For(start, end, index => { GetRequestMessage message = new GetRequestMessage(index, VersionCode.V2, new OctetString(communityPublic), new List <Variable> { new Variable(new ObjectIdentifier(oidIdentifier)) }); // Comment below to reveal wrong sequence number issue. Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); Stopwatch watch = new Stopwatch(); watch.Start(); var response = message.GetResponse(timeout, serverEndPoint, socket); watch.Stop(); Assert.Equal(index, response.RequestId()); } ); } finally { if (SnmpMessageExtension.IsRunningOnWindows) { engine.Stop(); } } return(Observable.Return(0)); }) .RetryWithBackoffStrategy( retryCount: 4, retryOnError: e => e is Messaging.TimeoutException ); source.Subscribe(result => { ending.Set(); }); Assert.True(ending.WaitOne(MaxTimeout)); }
public void TestResponsesFromSingleSourceWithMultipleThreads() { 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 = 10000; // Uncomment below to reveal wrong sequence number issue. // Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); //for (int index = start; index < end; index++) Parallel.For(start, 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")) }); // Comment below to reveal wrong sequence number issue. 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, 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(index, response.RequestId()); } ); engine.Stop(); }
public void TestTimeOut() { 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")) }); const int time = 1500; var timer = new Stopwatch(); timer.Start(); //IMPORTANT: test against an agent that doesn't exist. Assert.Throws<TimeoutException>(() => message.GetResponse(time, new IPEndPoint(IPAddress.Parse("8.8.8.8"), 161), socket)); timer.Stop(); long elapsedMilliseconds = timer.ElapsedMilliseconds; Console.WriteLine(@"elapsed: " + elapsedMilliseconds); Console.WriteLine(@"timeout: " + time); Assert.LessOrEqual(time, elapsedMilliseconds); // FIXME: these values are valid on my machine openSUSE 11.2. (lex) // This test case usually fails on Windows, as strangely WinSock API call adds an extra 500-ms. if (SnmpMessageExtension.IsRunningOnMono) { Assert.LessOrEqual(elapsedMilliseconds, time + 100); } }
public void TestTimeOut() { // IMPORTANT: this test case requires a local SNMP agent such as // #SNMP Agent (snmpd), // Windows SNMP agent service, // Net-SNMP agent, or // snmp4j agent. 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")) }); const int time = 1500; bool hasException = false; try { message.GetResponse(time, new IPEndPoint(IPAddress.Loopback, 161), socket); } catch (TimeoutException) { hasException = true; } Assert.IsFalse(hasException); System.Diagnostics.Stopwatch timer = new System.Diagnostics.Stopwatch(); try { timer.Start(); //IMPORTANT: test against an agent that doesn't exist. // ReSharper disable AssignNullToNotNullAttribute message.GetResponse(time, new IPEndPoint(IPAddress.Parse("192.168.0.233"), 161), socket); // ReSharper restore AssignNullToNotNullAttribute } catch (TimeoutException) { hasException = true; } timer.Stop(); long elapsedMilliseconds = timer.ElapsedMilliseconds; Console.WriteLine(@"elapsed: " + elapsedMilliseconds); Console.WriteLine(@"timeout: " + time); Assert.LessOrEqual(time, elapsedMilliseconds); Assert.IsTrue(hasException); // FIXME: these values are valid on my machine openSUSE 11.2. (lex) // This test case usually fails on Windows, as strangely WinSock API call adds an extra 500-ms. if (SnmpMessageExtension.IsRunningOnMono) { Assert.LessOrEqual(elapsedMilliseconds, time + 100); } }
private void GetSnmpData(string _host) { //snmpwalk -v3 -l authNoPriv -u [user] -a MD5 - A [password] [host] IPAddress hostIP; if (!IPAddress.TryParse(_host, out hostIP)) { try { hostIP = Dns.GetHostAddresses(_host)[0]; } catch (Exception ex) { MessageBox.Show(ex.ToString()); } } try { Discovery discovery = Messenger.GetNextDiscovery(SnmpType.GetRequestPdu); ReportMessage report = discovery.GetResponse(5000, new IPEndPoint(hostIP, 161)); var auth = new MD5AuthenticationProvider(new OctetString(txtPassword.Text)); var priv = new DefaultPrivacyProvider(auth); List <Variable> vList = new List <Variable>(); foreach (OidData oidData in OidList) { vList.Add(new Variable(new ObjectIdentifier(oidData.Oid))); } GetRequestMessage request = new GetRequestMessage( VersionCode.V3, Messenger.NextMessageId, Messenger.NextRequestId, new OctetString("read"), vList, priv, Messenger.MaxMessageSize, report); ISnmpMessage reply = request.GetResponse(5000, new IPEndPoint(hostIP, 161)); if (reply.Pdu().ErrorStatus.ToInt32() != 0) // != ErrorCode.NoError { throw ErrorException.Create( "error in response", hostIP, reply); } foreach (Variable v in reply.Pdu().Variables) { lbOutput.Items.Add(v); } lbOutput.Items.Add("-------------------------------"); Listbox_ScrollToBottom(); } catch (SnmpException ex) { Console.WriteLine(ex); } catch (SocketException ex) { Console.WriteLine(ex); } }
public static void Main(string[] args) { string community = "public"; bool showHelp = false; bool showVersion = false; VersionCode version = VersionCode.V1; int timeout = 1000; int retry = 0; Levels level = Levels.Reportable; string user = string.Empty; string authentication = string.Empty; string authPhrase = string.Empty; string privacy = string.Empty; string privPhrase = string.Empty; bool dump = false; OptionSet p = new OptionSet() .Add("c:", "Community name, (default is public)", delegate(string v) { if (v != null) { community = v; } }) .Add("l:", "Security level, (default is noAuthNoPriv)", delegate(string v) { if (v.ToUpperInvariant() == "NOAUTHNOPRIV") { level = Levels.Reportable; } else if (v.ToUpperInvariant() == "AUTHNOPRIV") { level = Levels.Authentication | Levels.Reportable; } else if (v.ToUpperInvariant() == "AUTHPRIV") { level = Levels.Authentication | Levels.Privacy | Levels.Reportable; } else { throw new ArgumentException("no such security mode: " + v); } }) .Add("a:", "Authentication method (MD5 or SHA)", delegate(string v) { authentication = v; }) .Add("A:", "Authentication passphrase", delegate(string v) { authPhrase = v; }) .Add("x:", "Privacy method", delegate(string v) { privacy = v; }) .Add("X:", "Privacy passphrase", delegate(string v) { privPhrase = v; }) .Add("u:", "Security name", delegate(string v) { user = v; }) .Add("h|?|help", "Print this help information.", delegate(string v) { showHelp = v != null; }) .Add("V", "Display version number of this application.", delegate(string v) { showVersion = v != null; }) .Add("d", "Display message dump", delegate(string v) { dump = true; }) .Add("t:", "Timeout value (unit is second).", delegate(string v) { timeout = int.Parse(v) * 1000; }) .Add("r:", "Retry count (default is 0)", delegate(string v) { retry = int.Parse(v); }) .Add("v|version:", "SNMP version (1, 2, and 3 are currently supported)", delegate(string v) { switch (int.Parse(v)) { case 1: version = VersionCode.V1; break; case 2: version = VersionCode.V2; break; case 3: version = VersionCode.V3; break; default: throw new ArgumentException("no such version: " + v); } }); if (args.Length == 0) { ShowHelp(p); return; } List <string> extra; try { extra = p.Parse(args); } catch (OptionException ex) { Console.WriteLine(ex.Message); return; } if (showHelp) { ShowHelp(p); return; } if (extra.Count < 2) { Console.WriteLine("invalid variable number: " + extra.Count); return; } if (showVersion) { Console.WriteLine(System.Reflection.Assembly.GetExecutingAssembly().GetName().Version); return; } IPAddress ip; bool parsed = IPAddress.TryParse(extra[0], out ip); if (!parsed) { foreach (IPAddress address in Dns.GetHostAddresses(extra[0]).Where(address => address.AddressFamily == AddressFamily.InterNetwork)) { ip = address; break; } if (ip == null) { Console.WriteLine("invalid host or wrong IP address found: " + extra[0]); return; } } try { List <Variable> vList = new List <Variable>(); for (int i = 1; i < extra.Count; i++) { Variable test = new Variable(new ObjectIdentifier(extra[i])); vList.Add(test); } IPEndPoint receiver = new IPEndPoint(ip, 161); if (version != VersionCode.V3) { foreach ( Variable variable in Messenger.Get(version, receiver, new OctetString(community), vList, timeout)) { Console.WriteLine(variable); } return; } if (string.IsNullOrEmpty(user)) { Console.WriteLine("User name need to be specified for v3."); return; } IAuthenticationProvider auth = (level & Levels.Authentication) == Levels.Authentication ? GetAuthenticationProviderByName(authentication, authPhrase) : DefaultAuthenticationProvider.Instance; IPrivacyProvider priv; if ((level & Levels.Privacy) == Levels.Privacy) { priv = new DESPrivacyProvider(new OctetString(privPhrase), auth); } else { priv = new DefaultPrivacyProvider(auth); } Discovery discovery = Messenger.GetNextDiscovery(SnmpType.GetRequestPdu); ReportMessage report = discovery.GetResponse(timeout, receiver); GetRequestMessage request = new GetRequestMessage(VersionCode.V3, Messenger.NextMessageId, Messenger.NextRequestId, new OctetString(user), vList, priv, Messenger.MaxMessageSize, report); ISnmpMessage reply = request.GetResponse(timeout, receiver); if (dump) { Console.WriteLine("Request message bytes:"); Console.WriteLine(ByteTool.Convert(request.ToBytes())); Console.WriteLine("Response message bytes:"); Console.WriteLine(ByteTool.Convert(reply.ToBytes())); } if (reply is ReportMessage) { if (reply.Pdu().Variables.Count == 0) { Console.WriteLine("wrong report message received"); return; } var id = reply.Pdu().Variables[0].Id; if (id != Messenger.NotInTimeWindow) { var error = id.GetErrorMessage(); Console.WriteLine(error); return; } // according to RFC 3414, send a second request to sync time. request = new GetRequestMessage(VersionCode.V3, Messenger.NextMessageId, Messenger.NextRequestId, new OctetString(user), vList, priv, Messenger.MaxMessageSize, reply); reply = request.GetResponse(timeout, receiver); } else if (reply.Pdu().ErrorStatus.ToInt32() != 0) // != ErrorCode.NoError { throw ErrorException.Create( "error in response", receiver.Address, reply); } foreach (Variable v in reply.Pdu().Variables) { Console.WriteLine(v); } } catch (SnmpException ex) { Console.WriteLine(ex); } catch (SocketException ex) { Console.WriteLine(ex); } }
public List <MIBObject> Get(RSU rsu, Core.Entities.User user, string OID) { List <MIBObject> mibObjects; try { IPEndPoint receiver = new IPEndPoint(rsu.IP, rsu.Port); int timeout = _managerSettings.Timeout; Discovery discovery = Messenger.GetNextDiscovery(SnmpType.GetRequestPdu); ReportMessage report = discovery.GetResponse(timeout, receiver); var auth = new SHA1AuthenticationProvider(new Lextm.SharpSnmpLib.OctetString(user.SNMPv3Auth)); var priv = new DESPrivacyProvider(new Lextm.SharpSnmpLib.OctetString(user.SNMPv3Priv), auth); GetRequestMessage request = new GetRequestMessage(VersionCode.V3 , Messenger.NextMessageId , Messenger.NextRequestId , new OctetString(user.UserName) , new OctetString(String.Empty) , new List <Variable> { new Variable(new ObjectIdentifier(OID)) } , priv , Messenger.MaxMessageSize , report); ISnmpMessage reply = request.GetResponse(timeout, receiver); // Need to send again (RFC 3414)??? if (reply is ReportMessage) { //throw new ReplyIsReportMessage(); request = new GetRequestMessage(VersionCode.V3 , Messenger.NextMessageId , Messenger.NextRequestId , new OctetString(user.UserName) , new OctetString(String.Empty) , new List <Variable> { new Variable(new ObjectIdentifier(OID)) } , priv , Messenger.MaxMessageSize , reply); reply = request.GetResponse(timeout, receiver); if (reply.Pdu().ErrorStatus.ToInt32() != 0) { throw new SnmpGetError(); } } else if (reply.Pdu().ErrorStatus.ToInt32() != 0) { throw new SnmpGetError(); } mibObjects = SNMPVariables2MIBObjects(reply.Pdu().Variables); return(mibObjects); } catch (Lextm.SharpSnmpLib.Messaging.TimeoutException ex) { mibObjects = new List <MIBObject>(); mibObjects.Add(new MIBObject("0", SnmpType.OctetString, "Timeout")); return(mibObjects); } }