/// <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(); }
/// <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(); }
/// <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); }
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*/ } } }
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); }
/// <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(); }
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()); }
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()); }
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*/ } }
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()); }
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(); } }
private void AddResponse(ResponsePdu pdu) { _vResponseEvent.WaitOne(); try { _vResponseQueue.Add(pdu); } finally { _vResponseEvent.Set(); } }