/// <summary>
        /// Creates a <see cref="ResponseMessage"/> with all contents.
        /// </summary>
        /// <param name="requestId">Request ID.</param>
        /// <param name="version">Protocol version.</param>
        /// <param name="community">Community name.</param>
        /// <param name="error">Error code.</param>
        /// <param name="index">Error index.</param>
        /// <param name="variables">Variables.</param>
        public ResponseMessage(int requestId, VersionCode version, OctetString community, ErrorCode error, int index, IList <Variable> variables)
        {
            if (variables == null)
            {
                throw new ArgumentNullException("variables");
            }

            if (community == null)
            {
                throw new ArgumentNullException("community");
            }

            if (version == VersionCode.V3)
            {
                throw new ArgumentException("Please use overload constructor for v3", "version");
            }

            Version    = version;
            Header     = Header.Empty;
            Parameters = new SecurityParameters(null, null, null, community, null, null);
            ResponsePdu pdu = new ResponsePdu(
                requestId,
                error,
                index,
                variables);

            Scope   = new Scope(pdu);
            Privacy = DefaultPrivacyProvider.DefaultPair;

            _bytes = SnmpMessageExtension.PackMessage(Version, Header, Parameters, Scope, Privacy).ToBytes();
        }
Example #2
0
        /// <summary>
        /// Creates a <see cref="ResponseMessage"/> with all contents.
        /// </summary>
        /// <param name="requestId">Request ID.</param>
        /// <param name="version">Protocol version.</param>
        /// <param name="community">Community name.</param>
        /// <param name="error">Error code.</param>
        /// <param name="index">Error index.</param>
        /// <param name="variables">Variables.</param>
        public ResponseMessage(int requestId, VersionCode version, OctetString community, ErrorCode error, int index, List <Variable> variables)
        {
            if (variables == null)
            {
                throw new ArgumentNullException(nameof(variables));
            }

            if (community == null)
            {
                throw new ArgumentNullException(nameof(community));
            }

            if (version == VersionCode.V3)
            {
                throw new ArgumentException("Please use overload constructor for v3.", nameof(version));
            }

            Version    = version;
            Header     = Header.Empty;
            Parameters = SecurityParameters.Create(community);
            var pdu = new ResponsePdu(
                requestId,
                error,
                index,
                variables);

            Scope   = new Scope(pdu);
            Privacy = DefaultPrivacyProvider.DefaultPair;

            _bytes = this.PackMessage(null).ToBytes();
        }
Example #3
0
        /// <summary>
        /// Sends message to a remote SMMP server
        /// </summary>
        /// <param name="message">A message to send</param>
        /// <param name="timeOut">A value in miliseconds after which the send operation times out</param>
        public void SendMessage(ShortMessage message, int timeOut)
        {
            if (message == null)
            {
                throw new ArgumentNullException("message");
            }

            //Check if connection is open
            if (_vState != SmppConnectionState.Connected)
            {
                throw new SmppClientException("Sending message operation failed because the SmppClient is not connected");
            }

            string messageId = null;

            foreach (SendSmPdu pdu in message.GetMessagePdUs(_vProperties.DefaultEncoding))
            {
                ResponsePdu resp = _vTrans.SendPdu(pdu, timeOut);
                if (resp.Header.ErrorCode != SmppErrorCode.EsmeRok)
                {
                    throw new SmppException(resp.Header.ErrorCode);
                }

                var submitSmResp = resp as SubmitSmResp;
                if (submitSmResp != null)
                {
                    messageId = ((SubmitSmResp)resp).MessageId;
                }
                message.MessageId = messageId;
            }
            RaiseMessageSentEvent(message);
        }
Example #4
0
        private void PduRequestProcessorCallback(RequestPdu pdu)
        {
            ResponsePdu resp = null;

            if (pdu is Unbind)
            {
                resp = pdu.CreateDefaultResponce();
                try { SendPduBase(resp); }
                catch { /*silent catch*/ }
                EndSession(SmppSessionCloseReason.UnbindRequested, null);
                return;
            }
            resp = RaisePduReceivedEvent(pdu);
            if (resp == null)
            {
                if (pdu.HasResponse)
                {
                    resp = pdu.CreateDefaultResponce();
                }
            }
            if (resp != null)
            {
                try { SendPduBase(resp); } catch { /*Silent catch*/ }
            }
        }
Example #5
0
        public ResponsePdu WaitResponse(RequestPdu pdu, int timeOut)
        {
            uint        sequenceNumber = pdu.Header.SequenceNumber;
            ResponsePdu resp           = FetchResponse(sequenceNumber);

            if (resp != null)
            {
                return(resp);
            }
            if (timeOut < 5000)
            {
                timeOut = _vDefaultResponseTimeout;
            }
            PduWaitContext waitContext = new PduWaitContext(sequenceNumber, timeOut);

            _vWaitingEvent.WaitOne();
            try { _vWaitingQueue.Add(waitContext); }
            finally { _vWaitingEvent.Set(); }
            waitContext.WaitForAlert();
            resp = FetchResponse(sequenceNumber);
            if (resp == null)
            {
                throw new SmppResponseTimedOutException();
            }
            return(resp);
        }
Example #6
0
        /// <summary>
        /// Creates a <see cref="ResponseMessage"/> with all contents.
        /// </summary>
        /// <param name="requestId">Request ID.</param>
        /// <param name="version">Protocol version.</param>
        /// <param name="community">Community name.</param>
        /// <param name="error">Error code.</param>
        /// <param name="index">Error index.</param>
        /// <param name="variables">Variables.</param>
        public ResponseMessage(int requestId, VersionCode version, OctetString community, ErrorCode error, int index, IList<Variable> variables)
        {
            if (variables == null)
            {
                throw new ArgumentNullException("variables");
            }

            if (community == null)
            {
                throw new ArgumentNullException("community");
            }

            if (version == VersionCode.V3)
            {
                throw new ArgumentException("Please use overload constructor for v3", "version");
            }

            Version = version;
            Header = Header.Empty;
            Parameters = SecurityParameters.Create(community);
            var pdu = new ResponsePdu(
                requestId,
                error,
                index,
                variables);
            Scope = new Scope(pdu);
            Privacy = DefaultPrivacyProvider.DefaultPair;

            _bytes = this.PackMessage(null).ToBytes();
        }
Example #7
0
 public void TestException()
 {
     Assert.Throws<ArgumentNullException>(() => new ResponsePdu(new Tuple<int, byte[]>(0, new byte[] { 0 }), null));
     Assert.Throws<ArgumentNullException>(() => new ResponsePdu(0, ErrorCode.NoError, 0, null));
     var pdu = new ResponsePdu(0, ErrorCode.NoError, 0, new List<Variable>());
     Assert.Throws<ArgumentNullException>(() => pdu.AppendBytesTo(null));
     Assert.AreEqual("Response PDU: seq: 0; status: 0; index: 0; variable count: 0", pdu.ToString());
 }
Example #8
0
        public void TestException()
        {
            Assert.Throws <ArgumentNullException>(() => new ResponsePdu(null));
            Assert.Throws <ArgumentNullException>(() => new ResponsePdu(0, ErrorCode.NoError, 0, null));
            var pdu = new ResponsePdu(0, ErrorCode.NoError, 0, new List <Variable>());

            Assert.Throws <ArgumentNullException>(() => pdu.AppendBytesTo(null));
            Assert.AreEqual("Response PDU: seq: 0; status: 0; index: 0; variable count: 0", pdu.ToString());
        }
        public void TestResponseV1()
        {
            ISnmpMessage message = MessageFactory.ParseMessages(File.ReadAllBytes(Path.Combine("Resources", "getresponse.dat")), new UserRegistry())[0];

            Assert.Equal(SnmpType.ResponsePdu, message.TypeCode());
            ISnmpPdu pdu = message.Pdu();

            Assert.Equal(SnmpType.ResponsePdu, pdu.TypeCode);
            ResponsePdu response = (ResponsePdu)pdu;

            Assert.Equal(Integer32.Zero, response.ErrorStatus);
            Assert.Equal(0, response.ErrorIndex.ToInt32());
            Assert.Equal(1, response.Variables.Count);
            Variable v = response.Variables[0];

            Assert.Equal(new uint[] { 1, 3, 6, 1, 2, 1, 1, 6, 0 }, v.Id.ToNumerical());
            Assert.Equal("Shanghai", v.Data.ToString());
        }
Example #10
0
        private void PduErrorEventHandler(object sender, PduErrorEventArgs e)
        {
            ResponsePdu resp = null;

            if (e.Pdu is RequestPdu)
            {
                RequestPdu req = (RequestPdu)e.Pdu;
                resp = req.CreateDefaultResponce();
                resp.Header.ErrorCode = e.Exception.ErrorCode;
            }
            else
            {
                resp = new GenericNack(e.Header);
                resp.Header.ErrorCode = e.Exception.ErrorCode;
            }
            try { SendPduBase(resp); }
            catch { /*silent catch*/ }
        }
Example #11
0
 private ResponsePdu FetchResponse(uint sequenceNumber)
 {
     _vResponseEvent.WaitOne();
     try
     {
         for (int index = 0; index < _vResponseQueue.Count; ++index)
         {
             ResponsePdu pdu = _vResponseQueue[index];
             if (pdu.Header.SequenceNumber == sequenceNumber)
             {
                 _vResponseQueue.RemoveAt(index);
                 return(pdu);
             }
         }
         return(null);
     }
     finally { _vResponseEvent.Set(); }
 }
        public void TestResponseV1()
        {
            ISnmpMessage message = MessageFactory.ParseMessages(Resources.getresponse, new UserRegistry())[0];

            Assert.AreEqual(SnmpType.ResponsePdu, message.Pdu.TypeCode);
            ISnmpPdu pdu = message.Pdu;

            Assert.AreEqual(SnmpType.ResponsePdu, pdu.TypeCode);
            ResponsePdu response = (ResponsePdu)pdu;

            Assert.AreEqual(new Integer32(0), response.ErrorStatus);
            Assert.AreEqual(0, response.ErrorIndex.ToInt32());
            Assert.AreEqual(1, response.Variables.Count);
            Variable v = response.Variables[0];

            Assert.AreEqual(new uint[] { 1, 3, 6, 1, 2, 1, 1, 6, 0 }, v.Id.ToNumerical());
            Assert.AreEqual("Shanghai", v.Data.ToString());
        }
Example #13
0
 public void Handle(ResponsePdu pdu)
 {
     AddResponse(pdu);
     _vWaitingEvent.WaitOne();
     try
     {
         uint sequenceNumber = pdu.Header.SequenceNumber;
         for (int index = 0; index < _vWaitingQueue.Count; ++index)
         {
             PduWaitContext waitContext = _vWaitingQueue[index];
             if (waitContext.SequenceNumber == sequenceNumber)
             {
                 _vWaitingQueue.RemoveAt(index);
                 waitContext.AlertResponseReceived();
                 if (waitContext.TimedOut)
                 {
                     FetchResponse(sequenceNumber);
                 }
                 return;
             }
         }
     }
     finally { _vWaitingEvent.Set(); }
 }
Example #14
0
 private void AddResponse(ResponsePdu pdu)
 {
     _vResponseEvent.WaitOne();
     try { _vResponseQueue.Add(pdu); }
     finally { _vResponseEvent.Set(); }
 }