コード例 #1
0
ファイル: Client.cs プロジェクト: isaveu/Yggdrasil
        /// <summary>
        /// Creates new instance.
        /// </summary>
        /// <param name="name"></param>
        public Client(string name)
        {
            _framer = new LengthPrefixFramer(MaxMessageSize);
            _framer.MessageReceived += this.OnMessageReceived;

            this.Name = name;
        }
コード例 #2
0
ファイル: LengthPrefixFramer.cs プロジェクト: xyfc/Yggdrasil
        public void ReceiveData_Multiple()
        {
            var receivedMessages = new List <byte[]>();

            var maxMessageSize = 10;
            var framer         = new LengthPrefixFramer(maxMessageSize);

            framer.MessageReceived += (msg => receivedMessages.Add(msg));

            // Create messages
            var message1 = new byte[] { 1, 2, 3, 4, 5 };
            var message2 = new byte[] { 5, 6, 7 };
            var message3 = Encoding.UTF8.GetBytes("foobar");

            // Put messages into one array
            var dataList = new List <byte>();

            dataList.AddRange(framer.Frame(message1));
            dataList.AddRange(framer.Frame(message2));
            dataList.AddRange(framer.Frame(message3));

            // Receive the array
            var data = dataList.ToArray();

            framer.ReceiveData(data, data.Length);

            // Check
            Assert.Equal(3, receivedMessages.Count);
            Assert.Equal(message1, receivedMessages[0]);
            Assert.Equal(message2, receivedMessages[1]);
            Assert.Equal(message3, receivedMessages[2]);
        }
コード例 #3
0
ファイル: LengthPrefixFramer.cs プロジェクト: xyfc/Yggdrasil
        public void ReceiveData_FragmentedInvalid()
        {
            var receivedMessages = new List <byte[]>();

            var maxMessageSize = 10;
            var framer         = new LengthPrefixFramer(maxMessageSize);

            framer.MessageReceived += (msg => receivedMessages.Add(msg));

            // Create messages
            var message1 = new byte[] { 1, 2, 3, 4, 5 };
            var message2 = new byte[] { 5, 6, 7 };
            var message3 = Encoding.UTF8.GetBytes("foobar too long");
            var message4 = Encoding.UTF8.GetBytes("foobar");

            // Put messages into one array
            var dataList = new List <byte>();

            dataList.AddRange(framer.Frame(message1));
            dataList.AddRange(framer.Frame(message2));
            dataList.AddRange(new byte[] { 19, 0, 0, 0 });
            dataList.AddRange(message3);
            dataList.AddRange(framer.Frame(message4));

            // Receive data step by step
            var steps = 3;

            for (var i = 0; i < dataList.Count; i += steps)
            {
                var take = Math.Min(dataList.Count - i, steps);
                if (take < 0)
                {
                    continue;
                }

                var data = dataList.Skip(i).Take(take).ToArray();
                if (i < 18)
                {
                    framer.ReceiveData(data, data.Length);
                }
                else
                {
                    Assert.Throws <InvalidMessageSizeException>(() => framer.ReceiveData(data, data.Length));
                    break;
                }
            }

            // Check
            // After the third message failed due an exception for being
            // too long, we should've received only the first two.
            Assert.Equal(2, receivedMessages.Count);
            Assert.Equal(message1, receivedMessages[0]);
            Assert.Equal(message2, receivedMessages[1]);
        }
コード例 #4
0
ファイル: LengthPrefixFramer.cs プロジェクト: xyfc/Yggdrasil
        public void Frame()
        {
            var maxMessageSize = 10;
            var framer         = new LengthPrefixFramer(maxMessageSize);

            // Check result
            var message = new byte[] { 1, 2, 3, 4, 5 };

            Assert.Equal(new byte[] { 9, 0, 0, 0, 1, 2, 3, 4, 5 }, framer.Frame(message));

            // Check max size exception
            var invalidMessage = new byte[maxMessageSize + 1];

            Assert.Throws <InvalidMessageSizeException>(() => framer.Frame(invalidMessage));
        }
コード例 #5
0
ファイル: LengthPrefixFramer.cs プロジェクト: xyfc/Yggdrasil
        public void ReceiveData_Single()
        {
            byte[] receivedMessage = null;

            var maxMessageSize = 10;
            var framer         = new LengthPrefixFramer(maxMessageSize);

            framer.MessageReceived += (msg => receivedMessage = msg);

            var message = new byte[] { 1, 2, 3, 4, 5 };
            var data    = framer.Frame(message);

            framer.ReceiveData(data, data.Length);

            Assert.Equal(message, receivedMessage);
        }
コード例 #6
0
ファイル: LengthPrefixFramer.cs プロジェクト: xyfc/Yggdrasil
        public void ReceiveData_Fragmented()
        {
            var receivedMessages = new List <byte[]>();

            var maxMessageSize = 10;
            var framer         = new LengthPrefixFramer(maxMessageSize);

            framer.MessageReceived += (msg => receivedMessages.Add(msg));

            // Check receiving a different amount of bytes each time
            foreach (var steps in new int[] { 1, 2, 3, 4, 5 })
            {
                // Create messages
                var message1 = new byte[] { 1, 2, 3, 4, 5 };
                var message2 = new byte[] { 5, 6, 7 };
                var message3 = Encoding.UTF8.GetBytes("foobar");

                // Put messages into one array
                var dataList = new List <byte>();
                dataList.AddRange(framer.Frame(message1));
                dataList.AddRange(framer.Frame(message2));
                dataList.AddRange(framer.Frame(message3));

                // Receive data step by step
                for (var i = 0; i < dataList.Count; i += steps)
                {
                    var take = Math.Min(dataList.Count - i, steps);
                    if (take < 0)
                    {
                        continue;
                    }

                    var data = dataList.Skip(i).Take(take).ToArray();
                    framer.ReceiveData(data, data.Length);
                }

                // Check
                Assert.Equal(3, receivedMessages.Count);
                Assert.Equal(message1, receivedMessages[0]);
                Assert.Equal(message2, receivedMessages[1]);
                Assert.Equal(message3, receivedMessages[2]);
                receivedMessages.Clear();
            }
        }
コード例 #7
0
 /// <summary>
 /// Creates new instance.
 /// </summary>
 public Connection()
 {
     _framer = new LengthPrefixFramer(MaxMessageSize);
     _framer.MessageReceived += this.OnMessageReceived;
 }
コード例 #8
0
        public void DataExchange()
        {
            var connections = new List <TestConnection>();
            var exceptions  = new List <Exception>();

            var acceptor = new TcpConnectionAcceptor <TestConnection>();

            acceptor.ConnectionAccepted += (conn => connections.Add(conn));
            acceptor.AcceptionException += (ex => exceptions.Add(ex));
            acceptor.Listen();

            var socket1 = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            var socket2 = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            socket1.Connect("127.0.0.1", acceptor.LocalEndPoint.Port);
            socket2.Connect("127.0.0.1", acceptor.LocalEndPoint.Port);

            Wait(50);

            var message1 = new byte[] { 1, 3, 5, 7 };
            var message2 = new byte[] { 8, 52, 45, 6 };
            var message3 = Encoding.UTF8.GetBytes("~foobar~");

            // Test receiving messages
            var framer = new LengthPrefixFramer(50);

            socket1.Send(framer.Frame(message1));
            socket1.Send(framer.Frame(message2));
            socket2.Send(framer.Frame(message3));

            Wait(50);

            Assert.Equal(2, connections[0].Messages.Count);
            Assert.Equal(1, connections[1].Messages.Count);

            Assert.Equal(message1, connections[0].Messages[0]);
            Assert.Equal(message2, connections[0].Messages[1]);
            Assert.Equal(message3, connections[1].Messages[0]);

            // Test receiving invalid message
            Exception receiveException = null;

            connections[0].ReceiveException += ((conn, ex) => receiveException = ex);
            socket1.Send(new byte[] { 0xFF, 0, 0, 0 });

            Wait(50);

            Assert.NotEqual(null, receiveException);
            Assert.IsType <InvalidMessageSizeException>(receiveException);

            // Test sending message
            var message4 = new byte[] { 9, 8, 7, 6 };

            connections[1].Send(message4);

            var buffer = new byte[10];
            var len    = socket2.Receive(buffer);

            Console.WriteLine(BitConverter.ToString(buffer));

            Assert.Equal(8, len);
            Assert.Equal(new byte[] { 8, 0, 0, 0, 9, 8, 7, 6, 0, 0 }, buffer);

            // Close everything
            foreach (var conn in connections)
            {
                conn.Close();
            }

            acceptor.Stop();
        }
コード例 #9
0
 public TestConnection()
 {
     _framer = new LengthPrefixFramer(10);
     _framer.MessageReceived += this.OnMessageReceived;
 }