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

📄 smppclient.cs.svn-base

📁 EasySMPP是一个VS.NET平台下的短信开发包
💻 SVN-BASE
📖 第 1 页 / 共 5 页
字号:
                {
                    disconnectSocket();
                    Thread.Sleep(reconnectTimeout);
                    if (mustBeConnected)
                    {
                        smscArray.NextSMSC();
                        connectToSMSC();
                    }
                }
                catch (Exception ex)
                {
                    logMessage(LogLevels.LogExceptions, "tryToReconnect | " + ex.ToString());
                }

            }//tryToReconnect

            private void receiveCallback(IAsyncResult ar)
            {
                try
                {
                    int _command_length;
                    uint _command_id;
                    int _command_status;
                    int _sequence_number;
                    int _body_length;
                    byte[] _PDU_body = new byte[0];
                    byte[] _RESPONSE_PDU = new byte[KernelParameters.MaxPduSize];
                    int i, x;
                    bool _exit_flag;

                    // Retrieve the state object and the client socket 
                    // from the async state object.
                    StateObject state = (StateObject)ar.AsyncState;
                    Socket client = state.workSocket;
                    // Read data from the remote device.
                    int bytesRead = client.EndReceive(ar);
                    logMessage(LogLevels.LogSteps, "Received " + Tools.ConvertIntToHexString(bytesRead) + " bytes");
                    if (bytesRead > 0)
                    {
                        // There might be more data, so store the data received so far.
                        if ((LogLevel & LogLevels.LogPdu) > 0)
                            logMessage(LogLevels.LogPdu, "Received Binary Data " + Tools.ConvertArrayToHexString(state.buffer, bytesRead));
                        //////////////////////////////
                        /// Begin processing SMPP messages
                        /// 
                        mLen = mPos + bytesRead;
                        if (mLen > KernelParameters.MaxBufferSize)
                        {
                            mPos = 0;
                            mLen = 0;
                            mbResponse = new byte[KernelParameters.MaxBufferSize];
                        }
                        else
                        {
                            Array.Copy(state.buffer, 0, mbResponse, mPos, bytesRead);
                            mPos = mLen;
                            _exit_flag = false;
                            x = 0;
                            while (((mLen - x) >= 16) && (_exit_flag == false))
                            {
                                _command_length = mbResponse[x + 0];
                                for (i = x + 1; i < x + 4; i++)
                                {
                                    _command_length <<= 8;
                                    _command_length = _command_length | mbResponse[i];
                                }

                                _command_id = mbResponse[x + 4];
                                for (i = x + 5; i < x + 8; i++)
                                {
                                    _command_id <<= 8;
                                    _command_id = _command_id | mbResponse[i];
                                }

                                _command_status = mbResponse[x + 8];
                                for (i = x + 9; i < x + 12; i++)
                                {
                                    _command_status <<= 8;
                                    _command_status = _command_status | mbResponse[i];
                                }

                                _sequence_number = mbResponse[x + 12];
                                for (i = x + 13; i < x + 16; i++)
                                {
                                    _sequence_number <<= 8;
                                    _sequence_number = _sequence_number | mbResponse[i];
                                }
                                if ((_command_length <= (mLen - x)) && (_command_length >= 16))
                                {
                                    if (_command_length == 16)
                                        _body_length = 0;
                                    else
                                    {
                                        _body_length = _command_length - 16;
                                        _PDU_body = new byte[_body_length];
                                        Array.Copy(mbResponse, x + 16, _PDU_body, 0, _body_length);
                                    }
                                    //////////////////////////////////////////////////////////////////////////////////////////
                                    ///SMPP Command parsing

                                    switch (_command_id)
                                    {
                                        case 0x80000009:
                                            logMessage(LogLevels.LogSteps, "Bind_Transiver_Resp");

                                            if (connectionState== ConnectionStates.SMPP_BIND_SENT)
                                            {
                                                if (_command_status == 0)
                                                {
                                                    connectionState= ConnectionStates.SMPP_BINDED;
                                                    logMessage(LogLevels.LogSteps, "SMPP Binded");
                                                }
                                                else
                                                {
                                                    logMessage(LogLevels.LogSteps | LogLevels.LogErrors, "SMPP BIND ERROR : " + Tools.ConvertIntToHexString(_command_status));
                                                    disconnect(client);
                                                    tryToReconnect();
                                                    return;
                                                }
                                            }
                                            else
                                            {
                                                logMessage(LogLevels.LogSteps | LogLevels.LogWarnings, "ERROR #3011 : Unexpected Bind_Transiver_Resp");
                                            }
                                            break;
                                        case 0x80000004:
                                            logMessage(LogLevels.LogSteps, "Submit_Sm_Resp");
                                            SubmitSmRespEventArgs evArg = new SubmitSmRespEventArgs(_sequence_number, _command_status, Tools.ConvertArrayToString(_PDU_body, _body_length - 1));
                                            processSubmitSmResp(evArg);
                                            break;
                                        case 0x80000103:
                                            logMessage(LogLevels.LogSteps, "Data_Sm_Resp");
                                            evArg = new SubmitSmRespEventArgs(_sequence_number, _command_status, Tools.ConvertArrayToString(_PDU_body, _body_length - 1));
                                            processSubmitSmResp(evArg);
                                            break;
                                        case 0x80000015:
                                            logMessage(LogLevels.LogSteps, "Enquire_Link_Resp");
                                            enquireLinkResponseTime = DateTime.Now;
                                            break;
                                        case 0x00000015:
                                            logMessage(LogLevels.LogSteps, "Enquire_Link");
                                            sendEnquireLinkResp(_sequence_number);
                                            break;
                                        case 0x80000006:
                                            logMessage(LogLevels.LogSteps, "Unbind_Resp");
                                            connectionState= ConnectionStates.SMPP_UNBINDED;
                                            disconnect(client);
                                            break;
                                        case 0x00000005:
                                            logMessage(LogLevels.LogSteps, "Deliver_Sm");
                                            decodeAndProcessDeliverSm(_sequence_number, _PDU_body, _body_length);
                                            break;
                                        case 0x00000103:
                                            logMessage(LogLevels.LogSteps, "Data_Sm");
                                            decodeAndProcessDataSm(_sequence_number, _PDU_body, _body_length);
                                            break;
                                        default:
                                            sendGenericNack(_sequence_number, StatusCodes.ESME_RINVCMDID);
                                            logMessage(LogLevels.LogSteps | LogLevels.LogWarnings, "Unknown SMPP PDU type" + Tools.ConvertUIntToHexString(_command_id));
                                            break;
                                    }
                                    ///////////////////////////////////////////////////////////////////////////////////////////
                                    ///END SMPP Command parsing
                                    ///////////////////////////////////////////////////////////////////////////////////////////

                                    if (_command_length == (mLen - x))
                                    {
                                        mLen = 0;
                                        mPos = 0;
                                        x = 0;
                                        _exit_flag = true;
                                    }
                                    else
                                    {
                                        x += _command_length;
                                    }
                                }
                                else
                                {
                                    sendGenericNack(_sequence_number, StatusCodes.ESME_RINVMSGLEN);
                                    mLen -= x;
                                    mPos = mLen;
                                    Array.Copy(mbResponse, x, mbResponse, 0, mLen);
                                    _exit_flag = true;
                                    logMessage(LogLevels.LogSteps | LogLevels.LogWarnings, "Invalid PDU Length");
                                }
                                if (x < mLen)
                                    logMessage(LogLevels.LogPdu, "NEXT PDU STEP IN POS " + Convert.ToString(x) + " FROM " + Convert.ToString(mLen));
                            }
                        }
                        //////////////////////////////
                        /// End processing SMPP messages
                        //  Get the rest of the data.
                        client.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,
                            new AsyncCallback(receiveCallback), state);
                    }
                    else
                    {
                        logMessage(LogLevels.LogSteps | LogLevels.LogWarnings, "Incoming network buffer from SMSC is empty.");
                        /*					if (client.Poll(0,SelectMode.SelectError)&&client.Poll(0,SelectMode.SelectRead)&&client.Poll(0,SelectMode.SelectWrite))
                                            {
                                                logMessage(LogLevels.LogSteps|LogLevels.LogExceptions, "Socket Error");
                                                unBind();
                                            }
                        */
                        tryToReconnect();
                    }
                }

                catch (Exception ex)
                {
                    logMessage(LogLevels.LogExceptions, "receiveCallback | " + ex.ToString());
                    unBind();
                }

            }//receiveCallback

            private void initClientParameters()
            {
                mbResponse = new byte[KernelParameters.MaxBufferSize];
                mPos = 0;
                mLen = 0;

                enquireLinkResponseTime = DateTime.Now;

                undeliveredMessages = 0;
            }//initClientParameters

            private void decodeAndProcessDeliverSm(int sequence_number, byte[] _body, int _length)
            {
                if (_length < 17)
                {
                    sendDeliverSmResp(sequence_number, StatusCodes.ESME_RINVCMDLEN);
                    return;
                }
                try
                {
                    bool isDeliveryReceipt = false;
                    bool isUdhiSet = 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[0];
                    int _sm_length;
                    int pos;

                    /////////////////////////////////////
                    /// Message Delivery Params
                    /// 
                    byte[] _receipted_message_id = new byte[254];
                    byte _receipted_message_id_len = 0;
                    byte _message_state = 0;
                    Int16 sar_msg_ref_num = 0;
                    byte sar_total_segments = 0;
                    byte sar_segment_seqnum = 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 0x01");
                        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 0x02");
                        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)
                    {

⌨️ 快捷键说明

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