void SendReqPdu(ISmppPdu RequestPdu, ref SmppAsyncObject AsyncObject)
        {
            if (RequestPdu.Header.SequenceNumber == 0)
            {
                RequestPdu.Header.SequenceNumber = GetSequenceNumber();
            }
            AsyncObject.mre = new ManualResetEvent(false);
            AddPendingResponse(RequestPdu.Header.SequenceNumber, AsyncObject);
            if (TcpConnection.Send(RequestPdu.ToByteArray()) <= 0)
            {
                RemovePendingResponse(RequestPdu.Header.SequenceNumber);
                TcpConnection.Disconnect();
                throw new Exception("Invalid connection State");
            }
            if (!AsyncObject.mre.WaitOne(Settings.Timeout, false) || (AsyncObject.PduRes == null))
            {
                RemovePendingResponse(RequestPdu.Header.SequenceNumber);
                if (Settings.DisconnectOnTimeout)
                {
                    TcpConnection.Disconnect();
                }
                throw new SmppTimeOutException();
            }
            var header = new SmppHeader(AsyncObject.PduRes);

            if (header.CommandId == -2147483648)
            {
                RemovePendingResponse(RequestPdu.Header.SequenceNumber);
                throw new SmppGenericNackException(SmppStatusCodes.GetDescription(RequestPdu.Header.CommandStatus));
            }
            RemovePendingResponse(RequestPdu.Header.SequenceNumber);
        }
        void ProcessPdu(ByteBuilder bb)
        {
            var header = new SmppHeader(bb);

            switch (header.CommandId)
            {
            case 5: {
                var pdu = new SmppDeliverSmReq(bb);
                RaiseDeliverSmReq(new SmppDeliverSmEventArgs(pdu));
                return;
            }

            case 6:
                TcpConnection.Disconnect();
                return;

            case 0x15:
                EnquireLinkRes(new SmppEnquireLinkRes(new SmppHeader(0x10, -2147483627, 0, header.SequenceNumber)));
                RaiseEnquireLinkReq(new SmppEnquireLinkEventArgs(ClientGuid, new SmppEnquireLinkReq(header)));
                return;
            }
        }
 void TcpConnection_DataReceived(object sender, SockClient.DataReceivedEventArgs e)
 {
     LastReceptionTime = DateTime.Now;
     while (TcpConnection.ReadSize() >= 0x10)
     {
         int bytes = SmppConverter.FromByteArrayToInt32(TcpConnection.PeekBytes(4));
         if (bytes > Settings.MaxPduSize)
         {
             TcpConnection.Disconnect();
             return;
         }
         if (bytes > TcpConnection.ReadSize())
         {
             break;
         }
         var             bb          = new ByteBuilder(TcpConnection.ReadByteArray(bytes, 0));
         var             header      = new SmppHeader(bb);
         SmppAsyncObject asyncObject = FindAsyncObject(header.SequenceNumber);
         if (asyncObject != null)
         {
             asyncObject.PduRes = bb;
             if (asyncObject.mre != null)
             {
                 asyncObject.mre.Set();
             }
             else if (asyncObject.Callback != null)
             {
                 new SmppCompletionCallbackHandler(ProcessAsyncPdu).BeginInvoke(asyncObject,
                                                                                SmppAsyncObject.SmppAsyncCompleted.Response,
                                                                                null, null);
             }
         }
         else
         {
             ProcessPdu(bb);
         }
     }
 }
示例#4
0
        internal static byte[] GetPduByteArray(ref SmppHeader Header, ISmppBasic Body, SmppTlv Tlv)
        {
            byte[] c        = null;
            byte[] buffer2  = null;
            byte[] arrayObj = null;
            buffer2 = Body.ToByteArray();
            Header.CommandLength = 0x10 + buffer2.Length;
            if (Tlv != null)
            {
                arrayObj              = Tlv.ToByteArray();
                Header.CommandLength += arrayObj.Length;
            }
            c = Header.ToByteArray();
            var builder = new ByteBuilder((c.Length + buffer2.Length) + GetArrayLength(arrayObj));

            builder.AddRange(c);
            builder.AddRange(buffer2);
            if (arrayObj != null)
            {
                builder.AddRange(arrayObj);
            }
            return(builder.ToArray());
        }
        void ProcessAsyncPdu(SmppAsyncObject AsyncObject, SmppAsyncObject.SmppAsyncCompleted CompletionReason)
        {
            try {
                Exception exception = null;
                object    obj2      = null;
                FindAndRemoveTransaction(AsyncObject);
                switch (CompletionReason)
                {
                case SmppAsyncObject.SmppAsyncCompleted.Response: {
                    var header = new SmppHeader(AsyncObject.PduRes);
                    if (header.CommandId != -2147483648)
                    {
                        break;
                    }
                    exception = new SmppGenericNackException();
                    goto Label_008E;
                }

                case SmppAsyncObject.SmppAsyncCompleted.Timeout:
                    exception = new SmppTimeOutException();
                    Interlocked.Increment(ref ConsecutiveTimeouts);
                    if (ConsecutiveTimeouts > Settings.WindowSize)
                    {
                        BeginUnBind();
                    }
                    goto Label_008E;

                case SmppAsyncObject.SmppAsyncCompleted.Disconnection:
                    exception = new SmppInvalidConnectionStateException();
                    goto Label_008E;

                default:
                    goto Label_008E;
                }
                obj2 = new SmppSubmitSmRes(AsyncObject.PduRes);
                ConsecutiveTimeouts = 0;
Label_008E:
                switch (AsyncObject.Request.Header.CommandId)
                {
                case 3: {
                    var args3 = new SmppAsyncQuerySmResEventArgs();
                    args3._State            = AsyncObject.State;
                    args3._ProcessException = exception;
                    args3._RequestPdu       = AsyncObject.Request as SmppQuerySmReq;
                    args3._ResponsePdu      = obj2 as SmppQuerySmRes;
                    var handler3 = AsyncObject.Callback as SmppQuerySmResHandler;
                    handler3(this, args3);
                    return;
                }

                case 4: {
                    var args = new SmppAsyncSubmitSmResEventArgs();
                    args._State            = AsyncObject.State;
                    args._ProcessException = exception;
                    args._RequestPdu       = AsyncObject.Request as SmppSubmitSmReq;
                    args._ResponsePdu      = obj2 as SmppSubmitSmRes;
                    var handler = AsyncObject.Callback as SmppSubmitSmResHandler;
                    handler(this, args);
                    return;
                }

                case 0x15:
                    break;

                default:
                    return;
                }
                var e = new SmppAsyncEnquireLinkResEventArgs();
                e._State            = AsyncObject.State;
                e._ProcessException = exception;
                e._RequestPdu       = AsyncObject.Request as SmppEnquireLinkReq;
                e._ResponsePdu      = obj2 as SmppEnquireLinkRes;
                var callback = AsyncObject.Callback as SmppAsyncEnquireLinkResHandler;
                callback(this, e);
            } catch (Exception exception2) {
                log.Error("Devshock: " + exception2);
            }
        }
 public SmppUnknownPduEventArgs(SmppHeader Header, byte[] BodyByteArray)
 {
     this.BodyByteArray = BodyByteArray;
     this.Header        = Header;
 }
示例#7
0
        void ProcessPdu(Guid ConnGuid, ByteBuilder bb)
        {
            var header = new SmppHeader(bb);

            if (bb.Count > 0x10)
            {
                bb.ToArray(0x10, bb.Count - 0x10);
            }
            if (((header.CommandId == 2) || (header.CommandId == 1)) || (header.CommandId == 9))
            {
                try {
                    var pdu = new SmppBindReq(bb);
                    if (OnBindReq != null)
                    {
                        OnBindReq(this, new SmppBindEventArgs(ConnGuid, pdu));
                    }
                } catch {}
            }
            else
            {
                int commandId = header.CommandId;
                if (commandId <= -2147483627)
                {
                    switch (commandId)
                    {
                    case -2147483643: {
                        var res = new SmppDeliverSmRes(bb);
                        if (OnDeliverSmRes != null)
                        {
                            OnDeliverSmRes(this, new SmppDeliverSmResEventArgs(ConnGuid, res));
                        }
                        return;
                    }

                    case -2147483627: {
                        var res2 = new SmppEnquireLinkRes(bb);
                        if (OnEnquireLinkRes != null)
                        {
                            OnEnquireLinkRes(this, new SmppEnquireLinkResEventArgs(ConnGuid, res2));
                            return;
                        }
                        break;
                    }
                    }
                }
                else
                {
                    switch (commandId)
                    {
                    case 3: {
                        var req4 = new SmppQuerySmReq(bb);
                        if (OnQuerySmReq != null)
                        {
                            OnQuerySmReq(this, new SmppQuerySmEventArgs(req4, ConnGuid));
                        }
                        return;
                    }

                    case 4: {
                        var req2 = new SmppSubmitSmReq(bb);
                        if (OnSubmitSmReq != null)
                        {
                            OnSubmitSmReq(this, new SmppSubmitSmEventArgs(ConnGuid, req2));
                        }
                        return;
                    }

                    case 5:
                        return;

                    case 6: {
                        var req5 = new SmppUnBindReq(bb);
                        if (OnUnBindReq != null)
                        {
                            OnUnBindReq(this, new SmppUnBindEventArgs(ConnGuid, req5));
                        }
                        return;
                    }

                    case 0x15: {
                        var req3 = new SmppEnquireLinkReq(bb);
                        if (OnEnquireLinkReq != null)
                        {
                            OnEnquireLinkReq(this, new SmppEnquireLinkEventArgs(ConnGuid, req3));
                        }
                        return;
                    }

                    default:
                        return;
                    }
                }
            }
        }