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(); } } }
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); }
/// <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); }
/// <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); }
/// <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; }
/// <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; }
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; }
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(); } } }