public void Clear() { m_InnerData.ClearSegements(); ExtensionData = new byte[0]; ApplicationData = new byte[0]; m_ActualPayloadLength = -1; }
public override void MessageTransferTest() { Socket socket; Stream stream; Handshake(SubProtocol, out socket, out stream); StringBuilder sb = new StringBuilder(); for (int i = 0; i < 10; i++) { sb.Append(Guid.NewGuid().ToString()); } string messageSource = sb.ToString(); Random rd = new Random(); ArraySegmentList receivedBuffer = new ArraySegmentList(); for (int i = 0; i < 10; i++) { int startPos = rd.Next(0, messageSource.Length - 2); int endPos = rd.Next(startPos + 1, Math.Min(messageSource.Length - 1, startPos + 1 + 100)); string currentCommand = messageSource.Substring(startPos, endPos - startPos); Console.WriteLine("Client:" + currentCommand); stream.Write(new byte[] { WebSocketConstant.StartByte }, 0, 1); byte[] data = m_Encoding.GetBytes("ECHO " + currentCommand); stream.Write(data, 0, data.Length); stream.Write(new byte[] { WebSocketConstant.EndByte }, 0, 1); stream.Flush(); int requredCount = m_Encoding.GetByteCount(currentCommand) + 2; Console.WriteLine("Require:" + requredCount); ReceiveMessage(stream, receivedBuffer, requredCount); Assert.AreEqual(requredCount, receivedBuffer.Count); Assert.AreEqual(WebSocketConstant.StartByte, receivedBuffer[0]); Assert.AreEqual(WebSocketConstant.EndByte, receivedBuffer[receivedBuffer.Count - 1]); Assert.AreEqual(currentCommand, m_Encoding.GetString(receivedBuffer.ToArrayData(1, receivedBuffer.Count - 2))); receivedBuffer.ClearSegements(); } socket.Shutdown(SocketShutdown.Both); socket.Close(); }
public virtual void MessageTransferTest() { Socket socket; Stream stream; Handshake(out socket, out stream); StringBuilder sb = new StringBuilder(); for (int i = 0; i < 10; i++) { sb.Append(Guid.NewGuid().ToString()); } string messageSource = sb.ToString(); Random rd = new Random(); ArraySegmentList<byte> receivedBuffer = new ArraySegmentList<byte>(); for (int i = 0; i < 10; i++) { int startPos = rd.Next(0, messageSource.Length - 2); int endPos = rd.Next(startPos + 1, messageSource.Length - 1); string currentCommand = messageSource.Substring(startPos, endPos - startPos); Console.WriteLine("Client:" + currentCommand); stream.Write(new byte[] { WebSocketConstant.StartByte }, 0, 1); byte[] data = Encoding.UTF8.GetBytes(currentCommand); stream.Write(data, 0, data.Length); stream.Write(new byte[] { WebSocketConstant.EndByte }, 0, 1); stream.Flush(); ReceiveMessage(stream, receivedBuffer, data.Length + 2); Assert.AreEqual(data.Length + 2, receivedBuffer.Count); Assert.AreEqual(WebSocketConstant.StartByte, receivedBuffer[0]); Assert.AreEqual(WebSocketConstant.EndByte, receivedBuffer[receivedBuffer.Count - 1]); Assert.AreEqual(currentCommand, Encoding.UTF8.GetString(receivedBuffer.ToArrayData(1, receivedBuffer.Count - 2))); receivedBuffer.ClearSegements(); } socket.Shutdown(SocketShutdown.Both); socket.Close(); }
public void TestEcho() { Socket socket; Stream stream; Handshake(SubProtocol, out socket, out stream); StringBuilder sb = new StringBuilder(); sb.Append("ECHO"); var parameters = new List <string>(); for (int i = 0; i < 3; i++) { var p = Guid.NewGuid().ToString(); sb.Append(" "); sb.Append(p); parameters.Add(p); } stream.Write(new byte[] { WebSocketConstant.StartByte }, 0, 1); byte[] data = m_Encoding.GetBytes(sb.ToString()); stream.Write(data, 0, data.Length); stream.Write(new byte[] { WebSocketConstant.EndByte }, 0, 1); stream.Flush(); var receivedBuffer = new ArraySegmentList(); foreach (var p in parameters) { ReceiveMessage(stream, receivedBuffer, Encoding.UTF8.GetBytes(p).Length + 2); string rp = m_Encoding.GetString(receivedBuffer.ToArrayData(1, receivedBuffer.Count - 2)); Console.WriteLine(rp); Assert.AreEqual(p, rp); receivedBuffer.ClearSegements(); } socket.Shutdown(SocketShutdown.Both); socket.Close(); }
public void Clear() { m_InnerData.ClearSegements(); m_ActualPayloadLength = -1; }
/// <summary> /// Filters the specified session. /// </summary> /// <param name="readBuffer">The read buffer.</param> /// <param name="offset">The offset.</param> /// <param name="length">The length.</param> /// <param name="toBeCopied">if set to <c>true</c> [to be copied].</param> /// <param name="rest">The rest.</param> /// <returns></returns> public override TRequestInfo Filter(byte[] readBuffer, int offset, int length, bool toBeCopied, out int rest) { // byte[] m_Request = new byte[length]; // System.Buffer.BlockCopy(m_Request, 0, readBuffer, offset, length if (!m_FoundHeader) { return(base.Filter(readBuffer, offset, length, toBeCopied, out rest)); } if (m_BodyBuffer == null || m_BodyBuffer.Count == 0) { if (length < m_BodyLength) { if (m_BodyBuffer == null) { m_BodyBuffer = new ArraySegmentList(); } m_BodyBuffer.AddSegment(readBuffer, offset, length, toBeCopied); rest = 0; return(NullRequestInfo); } else if (length == m_BodyLength) { rest = 0; m_FoundHeader = false; return(ResolveRequestInfo(m_Header, readBuffer, offset, length)); } else { rest = length - m_BodyLength; m_FoundHeader = false; return(ResolveRequestInfo(m_Header, readBuffer, offset, m_BodyLength)); } } else { int required = m_BodyLength - m_BodyBuffer.Count; if (length < required) { m_BodyBuffer.AddSegment(readBuffer, offset, length, toBeCopied); rest = 0; return(NullRequestInfo); } else if (length == required) { m_BodyBuffer.AddSegment(readBuffer, offset, length, toBeCopied); rest = 0; m_FoundHeader = false; var requestInfo = ResolveRequestInfo(m_Header, m_BodyBuffer.ToArrayData()); m_BodyBuffer.ClearSegements(); return(requestInfo); } else { m_BodyBuffer.AddSegment(readBuffer, offset, required, toBeCopied); rest = length - required; m_FoundHeader = false; var requestInfo = ResolveRequestInfo(m_Header, m_BodyBuffer.ToArrayData(0, m_BodyLength)); m_BodyBuffer.ClearSegements(); return(requestInfo); } } }
/// <summary> /// Clears the buffer segments. /// </summary> protected void ClearBufferSegments() { m_BufferSegments.ClearSegements(); }
public virtual void MessageBatchTransferTest() { Socket socket; Stream stream; Handshake(out socket, out stream); StringBuilder sb = new StringBuilder(); for (int i = 0; i < 10; i++) { sb.Append(Guid.NewGuid().ToString()); } string messageSource = sb.ToString(); Random rd = new Random(); ArraySegmentList receivedBuffer = new ArraySegmentList(); for (int i = 0; i < 10; i++) { var sentMessages = new string[10]; var sentLengths = new int[sentMessages.Length]; for (int j = 0; j < sentMessages.Length; j++) { int startPos = rd.Next(0, messageSource.Length - 2); int endPos = rd.Next(startPos + 1, Math.Min(messageSource.Length - 1, startPos + 1 + 5)); string currentCommand = messageSource.Substring(startPos, endPos - startPos); sentMessages[j] = currentCommand; Console.WriteLine("Client:" + currentCommand); stream.Write(new byte[] { WebSocketConstant.StartByte }, 0, 1); byte[] data = m_Encoding.GetBytes(currentCommand); sentLengths[j] = data.Length + 2; stream.Write(data, 0, data.Length); stream.Write(new byte[] { WebSocketConstant.EndByte }, 0, 1); } stream.Flush(); for (var j = 0; j < sentMessages.Length; j++) { Console.WriteLine("Expected: " + sentLengths[j]); ReceiveMessage(stream, receivedBuffer, sentLengths[j]); string message = m_Encoding.GetString(receivedBuffer.ToArrayData(1, receivedBuffer.Count - 2)); Console.WriteLine("E:" + sentMessages[j]); Console.WriteLine("A:" + message); Assert.AreEqual(WebSocketConstant.StartByte, receivedBuffer[0]); Assert.AreEqual(WebSocketConstant.EndByte, receivedBuffer[receivedBuffer.Count - 1]); Assert.AreEqual(sentMessages[j], message); Assert.AreEqual(sentLengths[j], receivedBuffer.Count); receivedBuffer.ClearSegements(); Console.WriteLine("Passed " + j); } } socket.Shutdown(SocketShutdown.Both); socket.Close(); }
public override void MessageBatchTransferTest() { Socket socket; Stream stream; Handshake(out socket, out stream); StringBuilder sb = new StringBuilder(); for (int i = 0; i < 10; i++) { sb.Append(Guid.NewGuid().ToString()); } string messageSource = sb.ToString(); Random rd = new Random(); ArraySegmentList receivedBuffer = new ArraySegmentList(); for (int i = 0; i < 10; i++) { var sentMessages = new string[10]; var sentMessageSizes = new int[10]; var sentLengths = new int[sentMessages.Length]; for (int j = 0; j < sentMessages.Length; j++) { int startPos = rd.Next(0, messageSource.Length - 2); int endPos = rd.Next(startPos + 1, Math.Min(messageSource.Length - 1, startPos + 1 + 5)); string currentCommand = messageSource.Substring(startPos, endPos - startPos); sentMessages[j] = currentCommand; Console.WriteLine("Client:" + currentCommand); byte[] data = Encoding.UTF8.GetBytes(currentCommand); Console.WriteLine("Client Length:" + data.Length); sentMessageSizes[j] = data.Length; int dataLen = SendMessage(stream, 1, data); sentLengths[j] = dataLen; } stream.Flush(); for (var j = 0; j < sentMessages.Length; j++) { Console.WriteLine("Expected: " + sentLengths[j]); ReceiveMessage(stream, receivedBuffer, sentLengths[j]); int mlen = sentMessageSizes[j]; Assert.AreEqual(sentLengths[j], receivedBuffer.Count); Assert.AreEqual(0x01, receivedBuffer[0] & 0x01); Assert.AreEqual(0x80, receivedBuffer[0] & 0x80); Assert.AreEqual(0x00, receivedBuffer[1] & 0x80); int skip = 2; if (mlen < 126) { Assert.AreEqual(mlen, (int)(receivedBuffer[1] & 0x7F)); } else if (mlen < 65536) { Assert.AreEqual(126, (int)(receivedBuffer[1] & 0x7F)); var sizeData = receivedBuffer.ToArrayData(2, 2); Assert.AreEqual(mlen, (int)sizeData[0] * 256 + (int)sizeData[1]); skip += 2; } else { Assert.AreEqual(127, (int)(receivedBuffer[1] & 0x7F)); var sizeData = receivedBuffer.ToArrayData(2, 8); long len = 0; int n = 1; for (int k = 7; k >= 0; k--) { len += (int)sizeData[k] * n; n *= 256; } Assert.AreEqual(mlen, len); skip += 8; } Assert.AreEqual(sentMessages[j], Encoding.UTF8.GetString(receivedBuffer.ToArrayData(skip, mlen))); receivedBuffer.ClearSegements(); Console.WriteLine("Passed " + j); } } socket.Shutdown(SocketShutdown.Both); socket.Close(); }
public override void MessageBatchTransferTest() { Socket socket; Stream stream; Handshake(out socket, out stream); StringBuilder sb = new StringBuilder(); for (int i = 0; i < 10; i++) { sb.Append(Guid.NewGuid().ToString()); } string messageSource = sb.ToString(); Random rd = new Random(); ArraySegmentList receivedBuffer = new ArraySegmentList(); for (int i = 0; i < 10; i++) { var sentMessages = new string[10]; var sentMessageSizes = new int[10]; var sentLengths = new int[sentMessages.Length]; for (int j = 0; j < sentMessages.Length; j++) { int startPos = rd.Next(0, messageSource.Length - 2); int endPos = rd.Next(startPos + 1, Math.Min(messageSource.Length - 1, startPos + 1 + 5)); string currentCommand = messageSource.Substring(startPos, endPos - startPos); sentMessages[j] = currentCommand; Console.WriteLine("Client:" + currentCommand); byte[] data = Encoding.UTF8.GetBytes(currentCommand); Console.WriteLine("Client Length:" + data.Length); sentMessageSizes[j] = data.Length; int dataLen = SendMessage(stream, 1, data); sentLengths[j] = dataLen; } stream.Flush(); for (var j = 0; j < sentMessages.Length; j++) { Console.WriteLine("Expected: " + sentLengths[j]); ReceiveMessage(stream, receivedBuffer, sentLengths[j]); int mlen = sentMessageSizes[j]; Assert.AreEqual(sentLengths[j], receivedBuffer.Count); Assert.AreEqual(0x01, receivedBuffer[0] & 0x01); Assert.AreEqual(0x80, receivedBuffer[0] & 0x80); Assert.AreEqual(0x00, receivedBuffer[1] & 0x80); int skip = 2; if (mlen < 126) Assert.AreEqual(mlen, (int)(receivedBuffer[1] & 0x7F)); else if (mlen < 65536) { Assert.AreEqual(126, (int)(receivedBuffer[1] & 0x7F)); var sizeData = receivedBuffer.ToArrayData(2, 2); Assert.AreEqual(mlen, (int)sizeData[0] * 256 + (int)sizeData[1]); skip += 2; } else { Assert.AreEqual(127, (int)(receivedBuffer[1] & 0x7F)); var sizeData = receivedBuffer.ToArrayData(2, 8); long len = 0; int n = 1; for (int k = 7; k >= 0; k--) { len += (int)sizeData[k] * n; n *= 256; } Assert.AreEqual(mlen, len); skip += 8; } Assert.AreEqual(sentMessages[j], Encoding.UTF8.GetString(receivedBuffer.ToArrayData(skip, mlen))); receivedBuffer.ClearSegements(); Console.WriteLine("Passed " + j); } } socket.Shutdown(SocketShutdown.Both); socket.Close(); }
public void TestEcho() { Socket socket; Stream stream; Handshake(SubProtocol, out socket, out stream); StringBuilder sb = new StringBuilder(); sb.Append("ECHO"); var parameters = new List<string>(); for (int i = 0; i < 3; i++) { var p = Guid.NewGuid().ToString(); sb.Append(" "); sb.Append(p); parameters.Add(p); } stream.Write(new byte[] { WebSocketConstant.StartByte }, 0, 1); byte[] data = m_Encoding.GetBytes(sb.ToString()); stream.Write(data, 0, data.Length); stream.Write(new byte[] { WebSocketConstant.EndByte }, 0, 1); stream.Flush(); var receivedBuffer = new ArraySegmentList(); foreach (var p in parameters) { ReceiveMessage(stream, receivedBuffer, Encoding.UTF8.GetBytes(p).Length + 2); string rp = m_Encoding.GetString(receivedBuffer.ToArrayData(1, receivedBuffer.Count - 2)); Console.WriteLine(rp); Assert.AreEqual(p, rp); receivedBuffer.ClearSegements(); } socket.Shutdown(SocketShutdown.Both); socket.Close(); }
public WebSocketDataFrame(ArraySegmentList data) { m_InnerData = data; m_InnerData.ClearSegements(); }
/// <summary> /// Filters the specified session. /// </summary> /// <param name="session">The session.</param> /// <param name="readBuffer">The read buffer.</param> /// <param name="offset">The offset.</param> /// <param name="length">The length.</param> /// <param name="toBeCopied">if set to <c>true</c> [to be copied].</param> /// <param name="left">The left.</param> /// <returns></returns> public override TRequestInfo Filter(IAppSession <TRequestInfo> session, byte[] readBuffer, int offset, int length, bool toBeCopied, out int left) { if (!m_FoundHeader) { return(base.Filter(session, readBuffer, offset, length, toBeCopied, out left)); } if (m_BodyBuffer == null || m_BodyBuffer.Count == 0) { if (length < m_BodyLength) { if (m_BodyBuffer == null) { m_BodyBuffer = new ArraySegmentList(); } m_BodyBuffer.AddSegment(readBuffer, offset, length, toBeCopied); left = 0; return(default(TRequestInfo)); } else if (length == m_BodyLength) { left = 0; m_FoundHeader = false; return(ResolveRequestData(m_Header, readBuffer, offset, length)); } else { left = length - m_BodyLength; m_FoundHeader = false; return(ResolveRequestData(m_Header, readBuffer, offset, m_BodyLength)); } } else { int required = m_BodyLength - m_BodyBuffer.Count; if (length < required) { m_BodyBuffer.AddSegment(readBuffer, offset, length, toBeCopied); left = 0; return(default(TRequestInfo)); } else if (length == required) { m_BodyBuffer.AddSegment(readBuffer, offset, length, toBeCopied); left = 0; m_FoundHeader = false; var requestInfo = ResolveRequestData(m_Header, m_BodyBuffer.ToArrayData()); m_BodyBuffer.ClearSegements(); return(requestInfo); } else { m_BodyBuffer.AddSegment(readBuffer, offset, required, toBeCopied); left = length - required; m_FoundHeader = false; var requestInfo = ResolveRequestData(m_Header, m_BodyBuffer.ToArrayData(0, m_BodyLength)); m_BodyBuffer.ClearSegements(); return(requestInfo); } } }
public override void MessageTransferTest() { Socket socket; Stream stream; Handshake(out socket, out stream); StringBuilder sb = new StringBuilder(); for (int i = 0; i < 10; i++) { sb.Append(Guid.NewGuid().ToString()); } string messageSource = sb.ToString(); Random rd = new Random(); ArraySegmentList receivedBuffer = new ArraySegmentList(); for (int i = 0; i < 100; i++) { int startPos = rd.Next(0, messageSource.Length - 2); int endPos = rd.Next(startPos + 1, messageSource.Length - 1); string currentCommand = messageSource.Substring(startPos, endPos - startPos); Console.WriteLine("Client:" + currentCommand); var data = Encoding.UTF8.GetBytes(currentCommand); Console.WriteLine("Client Length:" + data.Length); int dataLen = SendMessage(stream, 1, data); stream.Flush(); ReceiveMessage(stream, receivedBuffer, dataLen); Assert.AreEqual(dataLen, receivedBuffer.Count); Assert.AreEqual(0x01, receivedBuffer[0] & 0x01); Assert.AreEqual(0x80, receivedBuffer[0] & 0x80); Assert.AreEqual(0x00, receivedBuffer[1] & 0x80); int skip = 2; if (data.Length < 126) { Assert.AreEqual(data.Length, (int)(receivedBuffer[1] & 0x7F)); } else if (data.Length < 65536) { Assert.AreEqual(126, (int)(receivedBuffer[1] & 0x7F)); var sizeData = receivedBuffer.ToArrayData(2, 2); Assert.AreEqual(data.Length, (int)sizeData[0] * 256 + (int)sizeData[1]); skip += 2; } else { Assert.AreEqual(127, (int)(receivedBuffer[1] & 0x7F)); var sizeData = receivedBuffer.ToArrayData(2, 8); long len = 0; int n = 1; for (int k = 7; k >= 0; k--) { len += (int)sizeData[k] * n; n *= 256; } Assert.AreEqual(data.Length, len); skip += 8; } Assert.AreEqual(currentCommand, Encoding.UTF8.GetString(receivedBuffer.ToArrayData(skip, data.Length))); receivedBuffer.ClearSegements(); } //socket.Shutdown(SocketShutdown.Both); //socket.Close(); }
public override void MessageTransferTest() { Socket socket; Stream stream; Handshake(out socket, out stream); StringBuilder sb = new StringBuilder(); for (int i = 0; i < 10; i++) { sb.Append(Guid.NewGuid().ToString()); } string messageSource = sb.ToString(); Random rd = new Random(); ArraySegmentList receivedBuffer = new ArraySegmentList(); for (int i = 0; i < 100; i++) { int startPos = rd.Next(0, messageSource.Length - 2); int endPos = rd.Next(startPos + 1, messageSource.Length - 1); string currentCommand = messageSource.Substring(startPos, endPos - startPos); Console.WriteLine("Client:" + currentCommand); var data = Encoding.UTF8.GetBytes(currentCommand); Console.WriteLine("Client Length:" + data.Length); int dataLen = SendMessage(stream, 1, data); stream.Flush(); ReceiveMessage(stream, receivedBuffer, dataLen); Assert.AreEqual(dataLen, receivedBuffer.Count); Assert.AreEqual(0x01, receivedBuffer[0] & 0x01); Assert.AreEqual(0x80, receivedBuffer[0] & 0x80); Assert.AreEqual(0x00, receivedBuffer[1] & 0x80); int skip = 2; if (data.Length < 126) Assert.AreEqual(data.Length, (int)(receivedBuffer[1] & 0x7F)); else if (data.Length < 65536) { Assert.AreEqual(126, (int)(receivedBuffer[1] & 0x7F)); var sizeData = receivedBuffer.ToArrayData(2, 2); Assert.AreEqual(data.Length, (int)sizeData[0] * 256 + (int)sizeData[1]); skip += 2; } else { Assert.AreEqual(127, (int)(receivedBuffer[1] & 0x7F)); var sizeData = receivedBuffer.ToArrayData(2, 8); long len = 0; int n = 1; for (int k = 7; k >= 0; k--) { len += (int)sizeData[k] * n; n *= 256; } Assert.AreEqual(data.Length, len); skip += 8; } Assert.AreEqual(currentCommand, Encoding.UTF8.GetString(receivedBuffer.ToArrayData(skip, data.Length))); receivedBuffer.ClearSegements(); } //socket.Shutdown(SocketShutdown.Both); //socket.Close(); }