Esempio n. 1
0
 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();
        }
Esempio n. 3
0
        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);
                }
            }
        }
Esempio n. 7
0
 /// <summary>
 /// Clears the buffer segments.
 /// </summary>
 protected void ClearBufferSegments()
 {
     m_BufferSegments.ClearSegements();
 }
Esempio n. 8
0
        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();
        }
Esempio n. 10
0
        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 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 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);
                }
            }
        }
Esempio n. 15
0
 public WebSocketDataFrame(ArraySegmentList data)
 {
     m_InnerData = data;
     m_InnerData.ClearSegements();
 }
Esempio n. 16
0
        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();
        }
Esempio n. 17
0
        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();
        }
Esempio n. 18
0
        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();
        }