コード例 #1
0
        public void DisposeReadModeEmptyStreamMoreThanOnce()
        {
            SocketStream s;

            using (s = new SocketStream(GetSocket(), RecordType.FCGIStdin, true))
            {
            }

            s.Dispose();
            s.Dispose();
        }
コード例 #2
0
ファイル: IBLVMManager.cs プロジェクト: 10sa/IBLVM
 public void Dispose()
 {
     CryptoProvider.Dispose();
     SocketStream.Dispose();
     socket.Dispose();
     GC.SuppressFinalize(this);
 }
コード例 #3
0
 public void Dispose()
 {
     if (socket != null)
     {
         socket.Dispose();
         socket = null;
     }
 }
コード例 #4
0
        public void FlushAndDisposeWriteModeEmptyStreamMoreThanOnce()
        {
            // No error should happen, because flushing and closing the stream does not dispose or close the socket,
            // nor does it send any records
            SocketStream s;

            using (s = new SocketStream(GetSocket(), RecordType.FCGIStdin, false))
            {
                s.Flush();
                s.Flush();
                s.Flush();
            }

            s.Dispose();
            s.Dispose();

            Assert.Throws <ObjectDisposedException>(() => s.Flush());

            s.Dispose();
        }
コード例 #5
0
 /// <inheritdoc/>
 public void Dispose()
 {
     if (!_closed)
     {
         Close();
     }
     if (!ReferenceEquals(SocketStream, OriginalStream))
     {
         SocketStream.Dispose();
         SocketStream = OriginalStream;
     }
     _socket.Dispose();
     _cancellationTokenSource.Dispose();
     Data.Dispose();
 }
コード例 #6
0
        private async Task ProcessMessages()
        {
            Log?.Info($"Connected from {RemoteAddress.ToString(true)}");
            using (var collector = new FtpCommandCollector(() => Encoding))
            {
                await WriteAsync(new FtpResponse(220, "FTP Server Ready"), _cancellationTokenSource.Token);

                var buffer = new byte[1024];
                try
                {
                    Task <int> readTask = null;
                    for (; ;)
                    {
                        if (readTask == null)
                        {
                            readTask = SocketStream.ReadAsync(buffer, 0, buffer.Length, _cancellationTokenSource.Token);
                        }

                        var tasks = new List <Task>()
                        {
                            readTask
                        };
                        if (_activeBackgroundTask != null)
                        {
                            tasks.Add(_activeBackgroundTask);
                        }

                        Debug.WriteLine($"Waiting for {tasks.Count} tasks");
                        var completedTask = Task.WaitAny(tasks.ToArray(), _cancellationTokenSource.Token);
                        Debug.WriteLine($"Task {completedTask} completed");
                        if (completedTask == 1)
                        {
                            var response = _activeBackgroundTask?.Result;
                            if (response != null)
                            {
                                Write(response);
                            }
                            _activeBackgroundTask = null;
                        }
                        else
                        {
                            var bytesRead = readTask.Result;
                            readTask = null;
                            if (bytesRead == 0)
                            {
                                break;
                            }
                            var commands = collector.Collect(buffer, 0, bytesRead);
                            foreach (var command in commands)
                            {
                                await ProcessMessage(command);
                            }
                        }
                    }
                }
                catch (OperationCanceledException)
                {
                    // Ignore the OperationCanceledException
                    // This is normal during disconnects
                }
                catch (Exception ex)
                {
                    Log?.Error(ex, "Failed to process connection");
                }
                finally
                {
                    Log?.Info($"Disconnection from {RemoteAddress.ToString(true)}");
                    _closed = true;
                    Data.BackgroundCommandHandler.Cancel();
                    if (!ReferenceEquals(SocketStream, OriginalStream))
                    {
                        SocketStream.Dispose();
                        SocketStream = OriginalStream;
                    }
                    _socket.Dispose();
                    OnClosed();
                }
            }
        }