コード例 #1
0
        private void ReceiveCallback(IAsyncResult ar)
        {
            EndPoint source    = new IPEndPoint(0, 0);
            int      bytesRead = 0;

            try
            {
                bytesRead = _socket.EndReceiveFrom(ar, ref source);
            }
            catch (SocketException)
            {
                return;
            }

            // Parse the message
            if (source.Equals(_targetEndPoint) && bytesRead > 0)
            {
                try
                {
                    byte[] b = (byte[])ar.AsyncState;
                    _packetProtocol.DataReceived(b, bytesRead);
                }
                catch (ProtocolViolationException e)
                {
                    _packetProtocol.MessageArrived = null;
                    _packetProtocol = new PacketProtocol <TMessageType>(_bufferSize);
                    _packetProtocol.MessageArrived = (MessageType, data) => OnMessageReceived(MessageType, data);
                }
            }

            // Start receiving more data
            StartReceive();
        }
コード例 #2
0
        public void DataReceived_LengthShorterThanBuffer_OnlyReadsTheLength()
        {
            MessageType expectedMessageType = MessageType.Init;

            byte[] expectedBytes = new byte[] { 1, 2, 3, 4 };

            byte[] message = PacketProtocol <MessageType> .WrapMessage(expectedMessageType, expectedBytes);

            // Add bytes the package protocol should not read.
            byte[] tooLongMessage = message.Concat(new byte[] { 9, 8, 7 }).ToArray();

            MessageType receivedMessageType = MessageType.Unknown;

            byte[] receivedBytes = null;

            PacketProtocol <MessageType> packetProtocol = new PacketProtocol <MessageType>(100);

            packetProtocol.MessageArrived += (type, bytes) =>
            {
                receivedMessageType = type;
                receivedBytes       = bytes;
            };

            packetProtocol.DataReceived(tooLongMessage, message.Length);
            Assert.AreEqual(expectedMessageType, receivedMessageType);
            Assert.AreEqual(expectedBytes, receivedBytes);
        }
コード例 #3
0
        public static void Receive(TcpClient connection, BinaryReader reader, PacketProtocol packetProtocol)
        {
            var bufferSize = connection.Available;
            var buffer     = reader.ReadBytes(bufferSize);

            packetProtocol.DataReceived(buffer);
        }
コード例 #4
0
        public void DataReceived_FullMessage_ReturnsCorrectMessage()
        {
            MessageType expectedMessageType = MessageType.Init;

            byte[] expectedBytes = new byte[] { 1, 2, 3, 4 };

            byte[] message = PacketProtocol <MessageType> .WrapMessage(expectedMessageType, expectedBytes);

            MessageType receivedMessageType = MessageType.Unknown;

            byte[] receivedBytes = null;

            PacketProtocol <MessageType> packetProtocol = new PacketProtocol <MessageType>(100);

            packetProtocol.MessageArrived += (type, bytes) =>
            {
                receivedMessageType = type;
                receivedBytes       = bytes;
            };

            packetProtocol.DataReceived(message, message.Length);

            Assert.AreEqual(expectedMessageType, receivedMessageType);
            Assert.AreEqual(expectedBytes, receivedBytes);
        }
コード例 #5
0
        public void DataReceived_MessageSplitInMultiplePackages_ReturnsCorrectMessage()
        {
            MessageType expectedMessageType = MessageType.Init;

            byte[] expectedBytes = new byte[] { 1, 2, 3, 4 };

            byte[] message = PacketProtocol <MessageType> .WrapMessage(expectedMessageType, expectedBytes);

            Assert.AreEqual(12, message.Length, "This test assumes the message length is 12");

            byte[] messagePackage1 = { message[0],
                                       message[1],
                                       message[2] };
            byte[] messagePackage2 = { message[3],
                                       message[4],
                                       message[5] };
            byte[] messagePackage3 = { message[6],
                                       message[7],
                                       message[8] };
            byte[] messagePackage4 = { message[9],
                                       message[10],
                                       message[11], };

            MessageType receivedMessageType = MessageType.Unknown;

            byte[] receivedBytes = null;

            PacketProtocol <MessageType> packetProtocol = new PacketProtocol <MessageType>(100);

            packetProtocol.MessageArrived += (type, bytes) =>
            {
                receivedMessageType = type;
                receivedBytes       = bytes;
            };

            packetProtocol.DataReceived(messagePackage1, messagePackage1.Length);
            Assert.AreEqual(MessageType.Unknown, receivedMessageType);
            packetProtocol.DataReceived(messagePackage2, messagePackage2.Length);
            Assert.AreEqual(MessageType.Unknown, receivedMessageType);
            packetProtocol.DataReceived(messagePackage3, messagePackage3.Length);
            Assert.AreEqual(MessageType.Unknown, receivedMessageType);

            packetProtocol.DataReceived(messagePackage4, messagePackage4.Length);

            Assert.AreEqual(expectedMessageType, receivedMessageType);
            Assert.AreEqual(expectedBytes, receivedBytes);
        }
コード例 #6
0
        public void DataReceived_PackageTooLong_ThrowsProtocolViolationException()
        {
            MessageType expectedMessageType = MessageType.Init;

            byte[] expectedBytes = new byte[] { 1, 2, 3, 4 };

            byte[] message = PacketProtocol <MessageType> .WrapMessage(expectedMessageType, expectedBytes);

            // Add bytes the package protocol should not read.

            PacketProtocol <MessageType> packetProtocol = new PacketProtocol <MessageType>(10);

            Assert.Throws <ProtocolViolationException>(() => packetProtocol.DataReceived(message, message.Length));
        }
コード例 #7
0
        // -------------------- Receive -------------------- \\

        private void ReceiveCallback(IAsyncResult ar)
        {
            // Read incoming data from the client.
            if (_isDisposed)
            {
                Console.WriteLine($"Ignored incoming message as this object is disposed.");
                return;
            }

            int bytesRead = 0;

            try
            {
                bytesRead = _socket.EndReceive(ar);
            }
            catch (SocketException e)
            {
                OnDisconnect(e);
                return;
            }

            if (bytesRead > 0)
            {
                // Parse the message
                lock (_parsingMessageLock)
                {
                    try
                    {
                        byte[] b = (byte[])ar.AsyncState;
                        _packetProtocol.DataReceived(b, bytesRead);
                    }
                    catch (ProtocolViolationException e)
                    {
                        Console.WriteLine("Failed to receive data. Package protocol violation. \n" + e.ToString());
                        _packetProtocol.MessageArrived   = null;
                        _packetProtocol.KeepAliveArrived = null;
                        _packetProtocol = new PacketProtocol <TMessageType>(_bufferSize);
                        _packetProtocol.MessageArrived = (MessageType, data) => OnMessageReceived(MessageType, data);
                    }
                }
                // Start receiving more data
                byte[] buffer = new byte[_bufferSize];
                _socket.BeginReceive(buffer, 0, _bufferSize, 0, new AsyncCallback(ReceiveCallback), buffer);
            }
        }
コード例 #8
0
ファイル: SocketClient.cs プロジェクト: argian/MGRLastBastion
        /// <summary>
        /// Ends receiving message from remote client.
        /// </summary>
        /// <param name="ar"></param>
        private static void ReceiveCallback(IAsyncResult ar)
        {
            try
            {
                // Retrieve the state object and the client socket from the asynchronous state object:
                StateObject state  = (StateObject)ar.AsyncState;
                Socket      client = state.workSocket;


                if (state == null)
                {
                    Debug.Log("State is null");
                }
                if (packetizer == null)
                {
                    Debug.Log("packetizer is null");
                }


                // Read data from the remote device:
                int bytesRead = client.EndReceive(ar);

                if (bytesRead > 0)
                {
                    // pass received data and receiving process to packetizer object:
                    packetizer.DataReceived(state.buffer);
                }

                // Signal that all bytes have been received:
                receiveDone.Set();
            }
            catch (Exception ex)
            {
                Debug.Log(ex.ToString());
            }
        }