public void ReadAndWriteMultipleFragmentsThreaded(int maxReadLength, int maxReserveLength)
        {
            this.reader = new TcpReader(this.readerTcpClient.Client, maxReadLength);
            this.writer = new TcpWriter(this.writerTcpClient.Client, maxReserveLength);

            this.writerTcpClient.Client.SendBufferSize = 1;

            var xdrReader = new XdrReader(this.reader);
            var xdrWriter = new XdrWriter(this.writer);

            byte[] value = TestXdr.GenerateByteTestData(17);

            var task = Task.Run(
                () =>
            {
                NetworkReadResult readResult = this.reader.BeginReading();
                Assert.That(readResult.SocketError, Is.EqualTo(SocketError.Success));
                Assert.That(xdrReader.ReadOpaque(), Is.EqualTo(value));
                Assert.That(xdrReader.ReadInt(), Is.EqualTo(42));
                this.reader.EndReading();
            });

            this.writer.BeginWriting();
            xdrWriter.WriteVariableLengthOpaque(value);
            xdrWriter.Write(42);
            this.writer.EndWriting(null);

            task.Wait();
        }
Example #2
0
        public void Go()
        {
            using (var tcpClient = new TcpClient())
            {
                tcpClient.NoDelay = true;
                tcpClient.Connect(_host, _port);

                var stream = tcpClient.GetStream();
                _cancel = new CancellationTokenSource();
                _pipe   = new Pipe <dynamic>();

                _writer = new TcpWriter(stream, _cancel.Token, _pipe);
                _reader = new TcpReader(stream, _cancel.Token, _pipe);

                _ai        = new NibblesAi();
                _aiHandler = new NibblesAiHandler(_ai, _pipe.ReceiveQueue, _pipe.SendQueue, _cancel.Token);

                var tasks = new List <Task>();
                tasks.Add(Task.Factory.StartNew(() => _aiHandler.Go(), _cancel.Token, TaskCreationOptions.LongRunning,
                                                TaskScheduler.Default));
                tasks.Add(Task.Factory.StartNew(() => _writer.Start(), _cancel.Token,
                                                TaskCreationOptions.LongRunning, TaskScheduler.Default));
                tasks.Add(Task.Factory.StartNew(() => _reader.Start(), _cancel.Token,
                                                TaskCreationOptions.LongRunning, TaskScheduler.Default));

                Console.WriteLine("Hit enter to cancel");
                Console.ReadLine();

                Console.WriteLine("Cancelling...");
                _cancel.Cancel();

                try
                {
                    Task.WaitAll(tasks.ToArray());
                }
                catch (AggregateException e)
                {
                    Console.WriteLine("\nAggregateException thrown with the following inner exceptions:");
                    // Display information about each exception.
                    foreach (var v in e.InnerExceptions)
                    {
                        if (v is TaskCanceledException)
                        {
                            Console.WriteLine("   TaskCanceledException: Task {0}", ((TaskCanceledException)v).Task.Id);
                        }
                        else
                        {
                            Console.WriteLine("   Exception: {0}", v.GetType().Name);
                        }
                    }
                    Console.WriteLine();
                }
                finally
                {
                    _cancel.Dispose();
                }
            }
        }
Example #3
0
        private void EndReadBody(IAsyncResult ar)
        {
            Exception error = null;

            try
            {
                int read;
                lock (_sync)
                {
                    if (_disposed)
                    {
                        throw new ObjectDisposedException(typeof(TcpClient).FullName);
                    }
                    read = _stream.EndRead(ar);
                }
                Log.Debug("read {0} bytes of body", read);

                if (read <= 0)
                {
                    throw new EndOfStreamException();
                }

                _leftToRead -= read;
                _readPos    += read;

                if (_leftToRead <= 0)
                {
                    Log.Trace(Toolkit.DumpToLog, "received byte dump: {0}", _readBuf);
                    _tcpReader.AppendBlock(_readBuf);
                    if (!_lastReadBlock)
                    {
                        Log.Debug("body readed", read);
                        BeginReadRecordMark();
                        return;
                    }
                }
                else
                {
                    SafeBeginRead(EndReadBody);
                    return;
                }
            }
            catch (Exception ex)
            {
                error = ex;
            }

            if (error != null)
            {
                _tcpReader = null;
            }

            _readCompleted(error, _tcpReader);
            _tcpReader     = null;
            _readCompleted = null;
            _readBuf       = null;
        }
        public void SetUp()
        {
            this.listener = new TcpListener(IPAddress.Loopback, 0);
            this.listener.Start();
            int port = ((IPEndPoint)this.listener.Server.LocalEndPoint).Port;

            this.readerTcpClient = new TcpClient();
            Task task = Task.Run(() => this.writerTcpClient = this.listener.AcceptTcpClient());

            this.readerTcpClient.Connect(IPAddress.Loopback, port);
            task.GetAwaiter().GetResult();
            this.reader = new TcpReader(this.readerTcpClient.Client);
            this.writer = new TcpWriter(this.writerTcpClient.Client);
            this.listener.Stop();
        }
Example #5
0
        public void CanReadAppPattern()
        {
            using var connector        = new TcpConnector(out ushort port);
            using var connectingClient = new TcpReader(IPAddress.Any, port);

            while (connector.ConnectedClientsCount <= 0)
            {
                Thread.Sleep(10);
            }

            string sendingString = "This is supposed to be image data.";

            connector.Write(BitConverter.GetBytes((ushort)sendingString.Length));
            connector.Write(Encoding.UTF8.GetBytes(sendingString));

            Assert.AreEqual(sendingString, Encoding.UTF8.GetString(connectingClient.Read()));
        }
Example #6
0
        public MovementDetector()
        {
            ushort port;

            try
            {
                port = ushort.Parse(System.IO.File.ReadAllText(PortFile));
            }
            catch (Exception)
            {
                Console.WriteLine($"Could not parse port file \"{PortFile}\"");
                throw;
            }

            _tcp = new TcpReader(IPAddress.Any, port);

            _reader.Elapsed += async(_, _) => await GetMovement();
        }
Example #7
0
        private void EndReadRecordMark(IAsyncResult ar)
        {
            try
            {
                int read;
                lock (_sync)
                {
                    if (_disposed)
                    {
                        throw new ObjectDisposedException(typeof(TcpClient).FullName);
                    }
                    read = _stream.EndRead(ar);
                }
                Log.Debug("read {0} bytes of Record Mark", read);

                if (read <= 0)
                {
                    throw new EndOfStreamException();
                }

                _leftToRead -= read;
                _readPos    += read;

                if (_leftToRead <= 0)
                {
                    ExtractRecordMark();
                    SafeBeginRead(EndReadBody);
                }
                else
                {
                    SafeBeginRead(EndReadRecordMark);
                }
            }
            catch (Exception ex)
            {
                _readCompleted(ex, null);
                _tcpReader     = null;
                _readCompleted = null;
                _readBuf       = null;
            }
        }
Example #8
0
        private void OnMessageReaded(Exception err, TcpReader tcpReader)
        {
            if (err != null)
            {
                Log.Debug("No receiving TCP messages. Reason: {0}", err);
                OnException(err);
                return;
            }

            lock (_sync)
                _receivingInProgress = false;

            rpc_msg respMsg = null;
            Reader  r       = null;

            try
            {
                r       = Toolkit.CreateReader(tcpReader);
                respMsg = r.Read <rpc_msg>();
            }
            catch (Exception ex)
            {
                Log.Info("Parse exception: {0}", ex);
                BeginReceive();
                return;
            }

            Log.Trace("Received response xid:{0}", respMsg.xid);
            ITicket ticket = EnqueueTicket(respMsg.xid);

            BeginReceive();
            if (ticket == null)
            {
                Log.Debug("No handler for xid:{0}", respMsg.xid);
            }
            else
            {
                ticket.ReadResult(tcpReader, r, respMsg);
            }
        }
            /// <summary>
            /// The <see cref="Connection.Open()"/> implementation method.
            /// </summary>
            /// <remarks>
            /// This method is called on the service thread.
            /// </remarks>
            public override void OpenInternal()
            {
                base.OpenInternal();

                var initiator = (TcpInitiator)ConnectionManager;

                Debug.Assert(initiator != null);

                TcpClient client = Client;

                Debug.Assert(client != null);

                if (Stream == null)
                {
                    Stream = initiator.StreamProvider.GetStream(client);
                }

                var reader = new TcpReader(this);

                reader.Start();
                Reader = reader;
            }
Example #10
0
 private void CommandHandlerCycle()
 {
     try {
         while (true)
         {
             var message = TcpReader.ReadString();
             Log.Print($"TCP in [{message}] -> {GamePlayer.Nickname}");
             var command = message.Split(':');
             var args    = command.Length > 1 ? command[1].Split(' ') : default;
             foreach (var commands in CommandHandler.Values)
             {
                 if (commands.TryGetValue(command[0], out var action))
                 {
                     action(args);
                     break;
                 }
             }
         }
     } catch (Exception) {
         Disconnect();
     }
 }
Example #11
0
        public void AsyncRead(Action <Exception, TcpReader> completed)
        {
            //HACK: here you need to implement a timeout interrupt
            try
            {
                if (_readCompleted != null)
                {
                    throw new InvalidOperationException("already reading");
                }

                _tcpReader     = new TcpReader();
                _readCompleted = completed;

                BeginReadRecordMark();
            }
            catch (Exception ex)
            {
                _tcpReader     = null;
                _readCompleted = null;

                ThreadPool.QueueUserWorkItem((state) => completed(ex, null));
            }
        }
Example #12
0
        public void CanReadWriteData()
        {
            TcpReader connectingClient = null;

            using var connector        = new TcpConnector(out ushort port);
            connector.ClientConnected += Continue;
            connectingClient           = new TcpReader(IPAddress.Any, port);

            bool finished         = false;
            int? receivedAtClient = default;

            // int receivedAtListener = default;

            void Continue(object sender, NetworkStream e)
            {
                //Write to client / Read from client
                e.WriteByte(123);
                receivedAtClient = connectingClient.Read(1)[0];

                //Write to listener / Read from listener
                // connectingClient?.GetStream().WriteByte(213);
                // receivedAtListener = e.ReadByte();

                finished = true;
            }

            while (!finished)
            {
                Thread.Sleep(10);
            }

            Assert.AreEqual(123, receivedAtClient);
            // Assert.AreEqual(213, receivedAtListener);

            connectingClient?.Dispose();
        }
Example #13
0
        public void IsConnectionPossible()
        {
            using var connector        = new TcpConnector(out ushort port);
            connector.ClientConnected += Continue;
            using var connectingClient = new TcpReader(IPAddress.Any, port);

            bool success = false;

            void Continue(object sender, NetworkStream e)
            {
                success = true;
            }

            int tries      = 0;
            int totalTries = 30;

            while (!success && tries < totalTries)
            {
                Thread.Sleep(100);
            }

            Assert.AreNotEqual(totalTries, tries);
            Assert.IsTrue(success);
        }
Example #14
0
 /// <summary>
 /// Initializes a new instance of the <see cref="TcpReaderFileCache"/> class.
 /// </summary>
 public TcpReaderFileCache()
 {
     Actual    = new TcpReader();
     FileStore = new FileStore();
 }
        public void TcpReader_WhenDataIsSentToStreamWithFullMessageSeperator_ThenDataIsObserved(int tcpReaderBufferSize, string dataToSend, string dataToExpect)
        {
            //Arrange
            _tcpReader = new TcpReader(_serverSideTcpClient, new MessageParser(MessageSeperator), tcpReaderBufferSize);

            //Act
            var streamWriter = new StreamWriter(_tcpClient.GetStream());
            _tcpReader.Read().Subscribe(data =>
                {
                    _stringDataReturned += data;
                }, _completed.Set);

            streamWriter.Write(dataToSend);
            streamWriter.Flush();
            streamWriter.Close();

            //Assert
            _completed.Wait();
            Assert.AreEqual(dataToExpect, _stringDataReturned);
        }
        public void TcpReader_WhenDataMessageSentAndMessageSeperatorSentIn2Fragments_Then1MessagesIsObserved(int tcpReaderBufferSize)
        {
            //Arrange
            const string dataToSend = DataMessage;
            _tcpReader = new TcpReader(_serverSideTcpClient, new MessageParser(MessageSeperator), tcpReaderBufferSize);

            //Act
            var streamWriter = new StreamWriter(_tcpClient.GetStream());
            _tcpReader.Read().Subscribe(data =>
            {
                _stringDataReturned += data;
            }, _completed.Set);

            streamWriter.Write(dataToSend);
            streamWriter.Flush();
            streamWriter.Write(MessageSeperator.Substring(0,2));
            streamWriter.Flush();
            streamWriter.Write(MessageSeperator.Substring(2, MessageSeperator.Length-2));
            streamWriter.Flush();
            streamWriter.Close();

            //Assert
            _completed.Wait();
            Assert.AreEqual(dataToSend, _stringDataReturned);
        }
        public void TcpReader_WhenSeveralDataMessageSentAcrossMoreThanOneWriteAndNoMessageSeperators_ThenNoMessagesIsObserved(int tcpReaderBufferSize)
        {
            //Arrange
            _tcpReader = new TcpReader(_serverSideTcpClient, new MessageParser(MessageSeperator), tcpReaderBufferSize);
            const string dataToSend = DataMessage;

            //Act
            var streamWriter = new StreamWriter(_tcpClient.GetStream());
            _tcpReader.Read().Subscribe(data =>
            {
                _stringDataReturned += data;
            }, _completed.Set);

            streamWriter.Write(dataToSend);
            streamWriter.Flush();
            streamWriter.Write(dataToSend);
            streamWriter.Flush();
            streamWriter.Close();

            //Assert
            _completed.Wait();
            Assert.AreEqual(string.Empty, _stringDataReturned);
        }
Example #18
0
        private void EndReadBody(IAsyncResult ar)
        {
            Exception error = null;
            try
            {
                int read;
                lock(_sync)
                {
                    if(_disposed)
                        throw new ObjectDisposedException(typeof(TcpClient).FullName);
                    read = _stream.EndRead(ar);
                }
                Log.Debug("read {0} bytes of body", read);

                if(read <= 0)
                    throw new EndOfStreamException();

                _leftToRead -= read;
                _readPos += read;

                if(_leftToRead <= 0)
                {
                    Log.Trace(Toolkit.DumpToLog, "received byte dump: {0}", _readBuf);
                    _tcpReader.AppendBlock(_readBuf);
                    if(!_lastReadBlock)
                    {
                        Log.Debug("body readed", read);
                        BeginReadRecordMark();
                        return;
                    }
                }
                else
                {
                    SafeBeginRead(EndReadBody);
                    return;
                }
            }
            catch(Exception ex)
            {
                error = ex;
            }

            if(error != null)
                _tcpReader = null;

            _readCompleted(error, _tcpReader);
            _tcpReader = null;
            _readCompleted = null;
            _readBuf = null;
        }
Example #19
0
        private void OnMessageReaded(Exception err, TcpReader tcpReader)
        {
            if (err != null)
            {
                Log.Debug("No receiving TCP messages. Reason: {0}", err);
                OnException(err);
                return;
            }

            lock (_sync)
                _receivingInProgress = false;

            rpc_msg respMsg = null;
            Reader r = null;

            try
            {
                r = Toolkit.CreateReader(tcpReader);
                respMsg = r.Read<rpc_msg>();
            }
            catch (Exception ex)
            {
                Log.Info("Parse exception: {0}", ex);
                BeginReceive();
                return;
            }

            Log.Trace("Received response xid:{0}", respMsg.xid);
            ITicket ticket = EnqueueTicket(respMsg.xid);
            BeginReceive();
            if (ticket == null)
                Log.Debug("No handler for xid:{0}", respMsg.xid);
            else
                ticket.ReadResult(tcpReader, r, respMsg);
        }
Example #20
0
        private void EndReadRecordMark(IAsyncResult ar)
        {
            try
            {
                int read;
                lock(_sync)
                {
                    if(_disposed)
                        throw new ObjectDisposedException(typeof(TcpClient).FullName);
                    read = _stream.EndRead(ar);
                }
                Log.Debug("read {0} bytes of Record Mark", read);

                if(read <= 0)
                    throw new EndOfStreamException();

                _leftToRead -= read;
                _readPos += read;

                if(_leftToRead <= 0)
                {
                    ExtractRecordMark();
                    SafeBeginRead(EndReadBody);
                }
                else
                    SafeBeginRead(EndReadRecordMark);
            }
            catch(Exception ex)
            {
                _readCompleted(ex, null);
                _tcpReader = null;
                _readCompleted = null;
                _readBuf = null;
            }
        }
Example #21
0
        public void AsyncRead(Action<Exception, TcpReader> completed)
        {
            //HACK: here you need to implement a timeout interrupt
            try
            {
                if(_readCompleted != null)
                    throw new InvalidOperationException("already reading");

                _tcpReader = new TcpReader();
                _readCompleted = completed;

                BeginReadRecordMark();
            }
            catch(Exception ex)
            {
                _tcpReader = null;
                _readCompleted = null;

                ThreadPool.QueueUserWorkItem((state) => completed(ex, null));
            }
        }