Ejemplo n.º 1
0
        /// <summary>
        /// Async method for receive TCP clients
        /// </summary>
        /// <param name="ar">Async result</param>
        private void OnNewTcpClient(IAsyncResult ar)
        {
            var server = (TcpListener)ar.AsyncState;

            try
            {
                if (server.Server == null || !server.Server.IsBound)
                {
                    return;
                }

                using (var client = server.EndAcceptTcpClient(ar))
                {
                    server.BeginAcceptTcpClient(OnNewTcpClient, server);
                    //var res = server.BeginAcceptTcpClient(OnNewTcpClient, server);
                    //_disposables.Add(res.AsyncWaitHandle);
                    var cli = new FuzzerClientInfo()
                    {
                        Id           = Guid.NewGuid(),
                        Description  = client.Client.RemoteEndPoint.ToString(),
                        InternalName = client.Client.RemoteEndPoint.ToString()
                    };
                    UpdateFromStream(new FuzzerStat <FuzzerClientInfo>(cli), client.GetStream(), _cancel.Token);
                }
            }
            catch
            {
                // When stop the server could throw `ObjectDisposedException`
            }
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Start Pipe server
        /// </summary>
        /// <param name="connection">Connection</param>
        public void Start(FuzzerConnectionBase connection)
        {
            if (IsStarted)
            {
                throw new Exception("Already started");
            }

            try
            {
                _cancel      = new CancellationTokenSource();
                _disposables = new ConcurrentBag <IDisposable>();

                if (connection is FuzzerNamedPipeConnection pipe)
                {
                    _tasks    = new Task[5];
                    _tasks[0] = new Task(() => ProcessLogBagAsync(_cancel.Token));

                    for (int x = 1; x < _tasks.Length; x++)
                    {
                        _tasks[x] = new Task(() =>
                        {
                            var client = new FuzzerClientInfo()
                            {
                                Id           = Guid.NewGuid(),
                                Description  = "." + pipe.PipeName,
                                InternalName = "." + pipe.PipeName
                            };

                            while (!_cancel.Token.IsCancellationRequested)
                            {
                                NamedPipeServerStream server = null;

                                try
                                {
                                    _cancel.Token.ThrowIfCancellationRequested();

                                    server = new NamedPipeServerStream(pipe.PipeName, PipeDirection.InOut, _tasks.Length, PipeTransmissionMode.Byte);

                                    _disposables.Add(server);
                                    server.WaitForConnection();

                                    UpdateFromStream(new FuzzerStat <FuzzerClientInfo>(client), server, _cancel.Token);
                                }
                                catch                                 // (Exception ex)
                                {
                                    // Pipe error
                                }
                                finally
                                {
                                    try { server?.Dispose(); } catch { }
                                    _cancel?.Token.ThrowIfCancellationRequested();
                                }

                                Thread.Sleep(50);
                            }
                        },
                                             _cancel.Token);
                    }
                }
                else if (connection is FuzzerTcpConnection tcp)
                {
                    _tasks = new Task[]
                    {
                        new Task(() => ProcessLogBagAsync(_cancel.Token)),
                        new Task(() =>
                        {
                            var server = new TcpListener(tcp.EndPoint);
                            _disposables.Add(server.Server);

                            server.Start();
                            server.BeginAcceptTcpClient(OnNewTcpClient, server);
                            //var res = server.BeginAcceptTcpClient(OnNewTcpClient, server);
                            //_disposables.Add(res.AsyncWaitHandle);
                        },
                                 _cancel.Token)
                    };
                }
                else
                {
                    if (connection == null)
                    {
                        throw new NullReferenceException(nameof(connection));
                    }

                    throw new ArgumentException(nameof(connection));
                }

                _tasks.All(u =>
                {
                    u.Start();
                    return(true);
                });
            }
            catch (Exception e)
            {
                Stop();
                throw e;
            }
        }