⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 smppclient.cs.svn-base

📁 EasySMPP是一个VS.NET平台下的短信开发包
💻 SVN-BASE
📖 第 1 页 / 共 5 页
字号:
                        sendDeliverSmResp(sequence_number, StatusCodes.ESME_RUNKNOWNERR);
                        logMessage(LogLevels.LogExceptions, "decodeAndProcessDeliverSm returned UNKNOWNERR on 0x03");
                        return;
                    }
                    _esm_class = _body[++pos];
                    switch (_esm_class)
                    {
                        case 0x00:
                            break;
                        case 0x04:
                            logMessage(LogLevels.LogSteps, "Delivery Receipt Received");
                            isDeliveryReceipt = true;
                            break;
                        case 0x40:
                            logMessage(LogLevels.LogSteps, "UDHI Indicator set");
                            isUdhiSet = true;
                            break;
                        default:
                            logMessage(LogLevels.LogSteps | LogLevels.LogWarnings, "Unknown esm_class for DELIVER_SM : " + Tools.GetHexFromByte(_esm_class));
                            break;
                    }
                    pos += 1;
                    _priority_flag = _body[++pos];
                    pos += 4;
                    _data_coding = _body[++pos];
                    pos += 1;
                    _sm_length = _body[++pos];
                    pos += 1;
                    if (_sm_length > 0)
                    {
                        _short_message = new byte[_sm_length];
                        Array.Copy(_body, pos, _short_message, 0, _sm_length);
                    }
                    if ((isDeliveryReceipt) || (isUdhiSet))
                    {
                        int _par_tag, _par_tag_length;
                        bool exit = false;
                        if (_sm_length > 0)
                        {
                            pos += _sm_length;
                        }
                        while ((pos < _length) && (exit == false))
                        {
                            if (Tools.Get2ByteIntFromArray(_body, pos, _length, out _par_tag) == false)
                            {
                                exit = true;
                                break;
                            }
                            pos += 2;
                            if (Tools.Get2ByteIntFromArray(_body, pos, _length, out _par_tag_length) == false)
                            {
                                exit = true;
                                break;
                            }
                            pos += 2;
                            switch (_par_tag)
                            {
                                case 0x020C:
                                    if (((pos + _par_tag_length - 1) <= _length) && (_par_tag_length == 2))
                                    {
                                        byte[] temp = new byte[_par_tag_length];
                                        Array.Copy(_body, pos, temp, 0, _par_tag_length);
                                        pos += _par_tag_length;
                                        sar_msg_ref_num = BitConverter.ToInt16(temp, 0);
                                        logMessage(LogLevels.LogSteps, "sar_msg_ref_num : " + sar_msg_ref_num);
                                    }
                                    else
                                        exit = true;

                                    break;
                                case 0x020E:
                                    if ((pos <= _length) && (_par_tag_length == 1))
                                    {
                                        sar_total_segments = _body[pos];
                                        logMessage(LogLevels.LogSteps, "sar_total_segments : " + Convert.ToString(sar_total_segments));
                                        pos++;
                                    }
                                    else
                                        exit = true;

                                    break;
                                case 0x020F:
                                    if ((pos <= _length) && (_par_tag_length == 1))
                                    {
                                        sar_segment_seqnum = _body[pos];
                                        logMessage(LogLevels.LogSteps, "sar_segment_seqnum : " + Convert.ToString(sar_segment_seqnum));
                                        pos++;
                                    }
                                    else
                                        exit = true;

                                    break;
                                case 0x0427:
                                    if ((pos <= _length) && (_par_tag_length == 1))
                                    {
                                        _message_state = _body[pos];
                                        logMessage(LogLevels.LogSteps, "Message state : " + Convert.ToString(_message_state));
                                        pos++;
                                    }
                                    else
                                        exit = true;

                                    break;
                                case 0x001E:
                                    if ((pos + _par_tag_length - 1) <= _length)
                                    {
                                        _receipted_message_id = new byte[_par_tag_length];
                                        Array.Copy(_body, pos, _receipted_message_id, 0, _par_tag_length);
                                        _receipted_message_id_len = Convert.ToByte(_par_tag_length);
                                        pos += _par_tag_length;
                                        logMessage(LogLevels.LogSteps, "Delivered message id : " + Tools.ConvertArrayToString(_receipted_message_id, _receipted_message_id_len - 1));
                                    }
                                    else
                                        exit = true;
                                    break;
                                default:
                                    if ((pos + _par_tag_length - 1) <= _length)
                                        pos += _par_tag_length;
                                    else
                                        exit = true;
                                    logMessage(LogLevels.LogDebug, "_par_tag : " + Convert.ToString(_par_tag));
                                    logMessage(LogLevels.LogDebug, "_par_tag_length : " + Convert.ToString(_par_tag_length));
                                    break;

                            }
                        }
                        logMessage(LogLevels.LogDebug, "Delivery Receipt Processing Exit value - " + Convert.ToString(exit));
                        if (exit)
                            isDeliveryReceipt = false;
                    }

                    if ((sar_msg_ref_num > 0) && ((sar_total_segments > 0) && ((sar_segment_seqnum > 0) && (isUdhiSet))))
                    {
                        lock (sarMessages.SyncRoot)
                        {
                            SortedList tArr = new SortedList();
                            if (sarMessages.ContainsKey(sar_msg_ref_num))
                            {
                                tArr = (SortedList)sarMessages[sar_msg_ref_num];
                                if (tArr.ContainsKey(sar_segment_seqnum))
                                    tArr[sar_segment_seqnum] = _short_message;
                                else
                                    tArr.Add(sar_segment_seqnum, _short_message);
                                bool isFull = true;
                                byte i;
                                for (i = 1; i <= sar_total_segments; i++)
                                {
                                    if (!tArr.ContainsKey(i))
                                    {
                                        isFull = false;
                                        break;
                                    }//if
                                }//for
                                if (!isFull)
                                {
                                    sarMessages[sar_msg_ref_num] = tArr;
                                    sendDeliverSmResp(sequence_number, StatusCodes.ESME_ROK);
                                    return;
                                }
                                else
                                {
                                    _sm_length = 0;
                                    for (i = 1; i <= sar_total_segments; i++)
                                    {
                                        _sm_length += ((byte[])tArr[i]).Length;
                                    }
                                    _short_message = new byte[_sm_length + 100];
                                    _sm_length = 0;
                                    for (i = 1; i <= sar_total_segments; i++)
                                    {
                                        Array.Copy(((byte[])tArr[i]), 0, _short_message, _sm_length, ((byte[])tArr[i]).Length);
                                        _sm_length += ((byte[])tArr[i]).Length;
                                    }
                                    sarMessages.Remove(sar_msg_ref_num);
                                }
                            }//if
                            else
                            {
                                tArr.Add(sar_segment_seqnum, _short_message);
                                sarMessages.Add(sar_msg_ref_num, tArr);
                                sendDeliverSmResp(sequence_number, StatusCodes.ESME_ROK);
                                return;
                            }
                        }//lock
                    }
                    string to;
                    string from;
                    string textString;

                    string hexString = "";

                    byte messageState = 0;
                    string receiptedMessageID = "";

                    to = Encoding.ASCII.GetString(_dest_addr, 0, daLength);
                    from = Encoding.ASCII.GetString(_source_addr, 0, saLength);
                    if (_data_coding == 8) //USC2
                        textString = Encoding.BigEndianUnicode.GetString(_short_message, 0, _sm_length);
                    else
                        textString = Encoding.UTF8.GetString(_short_message, 0, _sm_length);
                    hexString = Tools.ConvertArrayToHexString(_short_message, _sm_length);

                    if (isDeliveryReceipt)
                    {
                        isDeliveryReceipt = true;
                        messageState = _message_state;
                        receiptedMessageID = Encoding.ASCII.GetString(_receipted_message_id, 0, _receipted_message_id_len - 1); ;
                    }

                    DeliverSmEventArgs evArg = new DeliverSmEventArgs(sequence_number, to, from, textString, hexString, _data_coding, _esm_class, isDeliveryReceipt, messageState, receiptedMessageID);
                    processDeliverSm(evArg);
                }
                catch (Exception ex)
                {
                    logMessage(LogLevels.LogExceptions, "decodeAndProcessDeliverSm | " + ex.ToString());
                    sendDeliverSmResp(sequence_number, StatusCodes.ESME_RUNKNOWNERR);
                }

            }//decodeAndProcessDeliverSm

            private void decodeAndProcessDataSm(int sequence_number, byte[] _body, int _length)
            {
                if (_length < 17)
                {
                    sendDeliverSmResp(sequence_number, StatusCodes.ESME_RINVCMDLEN);
                    return;
                }
                try
                {
                    bool isDeliveryReceipt = false;
                    byte _source_addr_ton, _source_addr_npi, _dest_addr_ton, _dest_addr_npi;
                    byte _priority_flag, _data_coding, _esm_class;
                    byte[] _source_addr = new byte[21];
                    byte[] _dest_addr = new byte[21];
                    byte saLength, daLength;
                    byte[] _short_message = new byte[254];
                    int pos;

                    /////////////////////////////////////
                    /// Message Delivery Params
                    /// 
                    byte[] _receipted_message_id = new byte[254];
                    byte _receipted_message_id_len = 0;
                    byte _message_state = 0;


                    pos = 0;
                    while ((pos < 5) && (_body[pos] != 0x00))
                        pos++;
                    if (_body[pos] != 0x00)
                    {
                        sendDeliverSmResp(sequence_number, StatusCodes.ESME_RUNKNOWNERR);
                        logMessage(LogLevels.LogExceptions, "decodeAndProcessDeliverSm returned UNKNOWNERR on 0x04");
                        return;
                    }
                    _source_addr_ton = _body[++pos];
                    _source_addr_npi = _body[++pos];
                    pos++;
                    saLength = 0;
                    while ((saLength < 20) && (_body[pos] != 0x00))
                    {
                        _source_addr[saLength] = _body[pos];
                        pos++;
                        saLength++;
                    }
                    if (_body[pos] != 0x00)
                    {
                        sendDeliverSmResp(sequence_number, StatusCodes.ESME_RUNKNOWNERR);
                        logMessage(LogLevels.LogExceptions, "decodeAndProcessDeliverSm returned UNKNOWNERR on 0x05");
                        return;
                    }
                    _dest_addr_ton = _body[++pos];
                    _dest_addr_npi = _body[++pos];
                    pos++;
                    daLength = 0;
                    while ((daLength < 20) && (_body[pos] != 0x00))
                    {
                        _dest_addr[daLength] = _body[pos];
                        pos++;
                        daLength++;
                    }
                    if (_body[pos] != 0x00)
                    {
                        sendDeliverSmResp(sequence_number, StatusCodes.ESME_RUNKNOWNERR);
                        logMessage(LogLevels.LogExceptions, "decodeAndProcessDeliverSm returned UNKNOWNERR on 0x06");
                        return;
                    }
                    _esm_class = _body[++pos];
                    switch (_esm_class)
                    {
                      

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -