Example #1
0
        private unsafe void DataLoop(byte data, int clientID)
        {
            _byteCache.Add(data);

            if (!_protocol.Received)
            {
                _savedHeaderInfo = _protocol.IsProtocolHeader(ref _byteCache);
                if (_savedHeaderInfo != null)
                {
                    _protocol.Received = true;
                }
                else
                {
                    _protocol.Received = false;
                }
            }
            else if (_protocol.Received)
            {
                SmmpPacket packet = _protocol.ReadFormSmProtocol(ref _byteCache, ref _savedHeaderInfo);
                if (packet != null)
                {
                    onReceivedData(_tcp._localTcpStruct, _remoteTcpStruct, packet, (byte[])_byteCache.ToArray(typeof(byte)));
                    _protocol.Received = false;
                    _byteCache.Clear();
                }
            }
        }
Example #2
0
        internal SmmpPacket DataLoop(byte data, int clientID)
        {
            _byteCache.Add(data);
            string s = DataEncoding.GetString((byte[])_byteCache.ToArray(typeof(byte)));

            if (!_protocol.Received)
            {
                SmmpProtocalHeader pheader = _protocol.IsProtocolHeader(ref _byteCache);
                if (pheader != null)
                {
                    _savedHeaderInfo   = pheader;
                    _protocol.Received = true;
                }
            }
            else if (_protocol.Received)
            {
                SmmpPacket packet = _protocol.ReadFormSmProtocol(ref _byteCache, ref _savedHeaderInfo);
                if (packet != null)
                {
                    onReceivedData(_localTcpStruct, _remoteTcpStruct, packet, null);
                    _protocol.Received = false;
                    _byteCache.Clear();
                }
                return(packet);
            }
            return(null);
        }
Example #3
0
        /// <summary>
        /// 获取SM协议头结构数据
        /// </summary>
        /// <param name="packetBuffer">数据</param>
        /// <returns></returns>
        public SmmpProtocalHeader IsProtocolHeader(ref ArrayList packetBuffer)
        {
            SmmpProtocalHeader HeaderInfo = new SmmpProtocalHeader();

            HeaderInfo.IsSmProtocol = false;


            string stringData = Encoding.Default.GetString((byte[])packetBuffer.ToArray(typeof(byte)));

            if (stringData.Length < 6)
            {
                return(null);
            }

            int startC = stringData.IndexOf("SMMP\r\n");

            if (startC == -1)
            {
                if (packetBuffer.Count > 1024)
                {
                    packetBuffer.Clear();
                }
                return(null);
            }

            stringData = stringData.Substring(startC, stringData.Length - startC);

            string[] headerLine = stringData.Split(new string[] { "\r\n" }, StringSplitOptions.None);
            if (headerLine.Length < 5)
            {
                return(null);
            }
            else
            {
                if (headerLine[0] != "SMMP")
                {
                    packetBuffer.Clear();
                    return(null);
                }
                if (!int.TryParse(headerLine[1], out HeaderInfo.MessageID))
                {
                    packetBuffer.Clear();
                    return(null);
                }
                if (!int.TryParse(headerLine[2], out HeaderInfo.ResponseID))
                {
                    packetBuffer.Clear();
                    return(null);
                }
                if (!int.TryParse(headerLine[3], out HeaderInfo.MessagesBytes))
                {
                    packetBuffer.Clear();
                    return(null);
                }
                HeaderInfo.IsSmProtocol = true;
                packetBuffer.Clear();
            }
            return(HeaderInfo);
        }
Example #4
0
        /// <summary>
        /// 根据SM协议头保存的状态读取数据
        /// </summary>
        /// <param name="packetBuffer">在状态缓存中的数据</param>
        /// <param name="headerInfo">协议头信息</param>
        /// <returns></returns>
        public SmmpPacket ReadFormSmProtocol(ref ArrayList packetBuffer, ref SmmpProtocalHeader headerInfo)
        {
            byte[] bytes = (byte[])packetBuffer.ToArray(typeof(byte));
            if (bytes.Length >= headerInfo.MessagesBytes && contentLength == 0)
            {
                byte[] headerMessageBytes = new byte[headerInfo.MessagesBytes];
                Memory.Memory.MemCpy(ref headerMessageBytes, ref bytes);

                string[] messageLines = Encoding.Default.GetString(headerMessageBytes).Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries);

                packet          = new SmmpPacket(headerInfo.MessageID, headerInfo.ResponseID);
                packet.Messages = new NameValueCollection();

                foreach (string messageLine in messageLines)
                {
                    string[] messageSplited = messageLine.Split(new string[] { ":" }, 2, StringSplitOptions.None);
                    if (messageSplited.Length == 2)
                    {
                        packet.Messages.Add(messageSplited[0], messageSplited[1]);
                    }
                }
                MessageRead = true;
                packetBuffer.Clear();
                if (packet.Messages.Count == 0)
                {
                    return(null);
                }
                if (int.TryParse(packet.Messages["ContentLength"], out contentLength))
                {
                    if (contentLength != 0)
                    {
                        return(null);
                    }
                }
                Received       = false;
                packet.RawData = bytes;
                return(packet);
            }
            else if (bytes.Length >= contentLength && contentLength > 0)
            {
                if (packet == null)
                {
                    return(null);
                }
                packet.ContentBuffer = new byte[contentLength];
                for (int i = 0; i < contentLength; i++)
                {
                    packet.ContentBuffer[i] = bytes[i];
                }

                packetBuffer.Clear();
                Received       = false;
                contentLength  = 0;
                packet.RawData = bytes;
                return(packet);
            }
            return(null);
        }
Example #5
0
        /// <summary>
        /// ����SMЭ��ͷ�����״̬��ȡ����
        /// </summary>
        /// <param name="packetBuffer">��״̬�����е�����</param>
        /// <param name="headerInfo">Э��ͷ��Ϣ</param>
        /// <returns></returns>
        public SmmpPacket ReadFormSmProtocol(ref ArrayList packetBuffer, ref SmmpProtocalHeader headerInfo)
        {
            byte[] bytes = (byte[])packetBuffer.ToArray(typeof(byte));
            if (bytes.Length >= headerInfo.MessagesBytes && contentLength == 0)
            {
                byte[] headerMessageBytes = new byte[headerInfo.MessagesBytes];
                Memory.Memory.MemCpy(ref headerMessageBytes, ref bytes);

                string[] messageLines = Encoding.Default.GetString(headerMessageBytes).Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries);

                packet = new SmmpPacket(headerInfo.MessageID, headerInfo.ResponseID);
                packet.Messages = new NameValueCollection();

                foreach (string messageLine in messageLines)
                {
                    string[] messageSplited = messageLine.Split(new string[] { ":" }, 2, StringSplitOptions.None);
                    if (messageSplited.Length == 2)
                        packet.Messages.Add(messageSplited[0], messageSplited[1]);
                }
                MessageRead = true;
                packetBuffer.Clear();
                if (packet.Messages.Count == 0) return null;
                if (int.TryParse(packet.Messages["ContentLength"], out contentLength))
                {
                    if (contentLength != 0)
                        return null;
                }
                Received = false;
                packet.RawData = bytes;
                return packet;
            }
            else if (bytes.Length >= contentLength && contentLength > 0)
            {
                if (packet == null) return null;
                packet.ContentBuffer = new byte[contentLength];
                for (int i = 0; i < contentLength; i++)
                    packet.ContentBuffer[i] = bytes[i];

                packetBuffer.Clear();
                Received = false;
                contentLength = 0;
                packet.RawData = bytes;
                return packet;
            }
            return null;
        }
Example #6
0
        /// <summary>
        /// ��ȡSMЭ��ͷ�ṹ����
        /// </summary>
        /// <param name="packetBuffer">����</param>
        /// <returns></returns>
        public SmmpProtocalHeader IsProtocolHeader(ref ArrayList packetBuffer)
        {
            SmmpProtocalHeader HeaderInfo = new SmmpProtocalHeader();
            HeaderInfo.IsSmProtocol = false;

            string stringData = Encoding.Default.GetString((byte[])packetBuffer.ToArray(typeof(byte)));
            if (stringData.Length < 6)
                return null;

            int startC = stringData.IndexOf("SMMP\r\n");
            if (startC == -1)
            {
                if (packetBuffer.Count > 1024) packetBuffer.Clear();
                return null;
            }

            stringData = stringData.Substring(startC, stringData.Length - startC);

            string[] headerLine = stringData.Split(new string[] { "\r\n" }, StringSplitOptions.None);
            if (headerLine.Length < 5) return null;
            else
            {
                if (headerLine[0] != "SMMP")
                {
                    packetBuffer.Clear();
                    return null;
                }
                if (!int.TryParse(headerLine[1], out HeaderInfo.MessageID))
                {
                    packetBuffer.Clear();
                    return null;
                }
                if (!int.TryParse(headerLine[2], out HeaderInfo.ResponseID))
                {
                    packetBuffer.Clear();
                    return null;
                }
                if (!int.TryParse(headerLine[3], out HeaderInfo.MessagesBytes))
                {
                    packetBuffer.Clear();
                    return null;
                }
                HeaderInfo.IsSmProtocol = true;
                packetBuffer.Clear();
            }
            return HeaderInfo;
        }
Example #7
0
 internal SmmpPacket DataLoop(byte data, int clientID)
 {
     _byteCache.Add(data);
     string s = DataEncoding.GetString((byte[])_byteCache.ToArray(typeof(byte)));
     if (!_protocol.Received)
     {
         SmmpProtocalHeader pheader = _protocol.IsProtocolHeader(ref _byteCache);
         if (pheader != null)
         {
             _savedHeaderInfo = pheader;
             _protocol.Received = true;
         }
     }
     else if (_protocol.Received)
     {
         SmmpPacket packet = _protocol.ReadFormSmProtocol(ref _byteCache, ref _savedHeaderInfo);
         if (packet != null)
         {
             onReceivedData(_localTcpStruct, _remoteTcpStruct, packet, null);
             _protocol.Received = false;
             _byteCache.Clear();
         }
         return packet;
     }
     return null;
 }
Example #8
0
        private unsafe void DataLoop(byte data, int clientID)
        {
            _byteCache.Add(data);

            if (!_protocol.Received)
            {
                _savedHeaderInfo = _protocol.IsProtocolHeader(ref _byteCache);
                if (_savedHeaderInfo != null)
                {
                    _protocol.Received = true;
                }
                else _protocol.Received = false;
            }
            else if (_protocol.Received)
            {
                SmmpPacket packet = _protocol.ReadFormSmProtocol(ref _byteCache, ref _savedHeaderInfo);
                if (packet != null)
                {
                    onReceivedData(_tcp._localTcpStruct, _remoteTcpStruct, packet, (byte[])_byteCache.ToArray(typeof(byte)));
                    _protocol.Received = false;
                    _byteCache.Clear();
                }
            }
        }