/// <summary> /// Initializes a new instance of the <see cref="Discovery"/> class. /// </summary> /// <param name="requestId">The request id.</param> /// <param name="messageId">The message id.</param> /// <param name="maxMessageSize">The max size of message.</param> public Discovery(int messageId, int requestId, int maxMessageSize) { _discovery = new GetRequestMessage( VersionCode.V3, new Header( new Integer32(messageId), new Integer32(maxMessageSize), Levels.Reportable), DefaultSecurityParameters, new Scope( OctetString.Empty, OctetString.Empty, new GetRequestPdu(requestId, new List <Variable>())), DefaultPrivacyProvider.DefaultPair); }
/// <summary> /// Gets a list of variable binds. /// </summary> /// <param name="version">Protocol version.</param> /// <param name="endpoint">Endpoint.</param> /// <param name="community">Community name.</param> /// <param name="variables">Variable binds.</param> /// <param name="timeout">The time-out value, in milliseconds. The default value is 0, which indicates an infinite time-out period. Specifying -1 also indicates an infinite time-out period.</param> /// <returns></returns> public static IList <Variable> Get(VersionCode version, IPEndPoint endpoint, OctetString community, IList <Variable> variables, int timeout) { if (endpoint == null) { throw new ArgumentNullException("endpoint"); } if (community == null) { throw new ArgumentNullException("community"); } if (variables == null) { throw new ArgumentNullException("variables"); } if (version == VersionCode.V3) { throw new NotSupportedException("SNMP v3 is not supported"); } var message = new GetRequestMessage(RequestCounter.NextId, version, community, variables); var response = message.GetResponse(timeout, endpoint); var pdu = response.Pdu(); if (pdu.ErrorStatus.ToInt32() != 0) { throw ErrorException.Create( "error in response", endpoint.Address, response); } return(pdu.Variables); }
/// <summary> /// Discovers agents of the specified version in a specific time interval. /// </summary> /// <param name="version">The version.</param> /// <param name="broadcastAddress">The broadcast address.</param> /// <param name="community">The community.</param> /// <param name="interval">The discovering time interval, in milliseconds.</param> /// <remarks><paramref name="broadcastAddress"/> must be an IPv4 address. IPv6 is not yet supported here.</remarks> public void Discover(VersionCode version, IPEndPoint broadcastAddress, OctetString community, int interval) { if (broadcastAddress == null) { throw new ArgumentNullException("broadcastAddress"); } if (version != VersionCode.V3 && community == null) { throw new ArgumentNullException("community"); } var addressFamily = broadcastAddress.AddressFamily; if (addressFamily == AddressFamily.InterNetworkV6) { throw new ArgumentException("IP v6 is not yet supported", "broadcastAddress"); } byte[] bytes; _requestId = Messenger.NextRequestId; if (version == VersionCode.V3) { // throw new NotSupportedException("SNMP v3 is not supported"); var discovery = new Discovery(Messenger.NextMessageId, _requestId, Messenger.MaxMessageSize); bytes = discovery.ToBytes(); } else { var message = new GetRequestMessage(_requestId, version, community, _defaultVariables); bytes = message.ToBytes(); } using (var udp = new UdpClient(addressFamily)) { #if (!CF) udp.EnableBroadcast = true; #endif udp.Send(bytes, bytes.Length, broadcastAddress); var activeBefore = Interlocked.CompareExchange(ref _active, Active, Inactive); if (activeBefore == Active) { // If already started, we've nothing to do. return; } #if CF _bufferSize = 8192; #else _bufferSize = udp.Client.ReceiveBufferSize; #endif #if ASYNC ThreadPool.QueueUserWorkItem(AsyncBeginReceive); #else ThreadPool.QueueUserWorkItem(AsyncReceive, udp.Client); #endif Thread.Sleep(interval); Interlocked.CompareExchange(ref _active, Inactive, Active); udp.Close(); } }