/// <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` } }
/// <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; } }