Ejemplo n.º 1
0
        private static async void WriteToSocket(TSocket tsocket, IPipeReader reader)
        {
            Exception error = null;

            try
            {
                while (true)
                {
                    var readResult = await reader.ReadAsync();

                    ReadableBuffer buffer = readResult.Buffer;
                    ReadCursor     end    = buffer.Start;
                    try
                    {
                        if ((buffer.IsEmpty && readResult.IsCompleted) || readResult.IsCancelled)
                        {
                            // EOF or TransportThread stopped
                            break;
                        }
                        if (!buffer.IsEmpty)
                        {
                            var result = TrySend(tsocket.Fd, ref buffer);
                            if (result.Value == buffer.Length)
                            {
                                end = buffer.End;
                            }
                            else if (result.IsSuccess)
                            {
                                end = buffer.Move(buffer.Start, result.Value);
                            }
                            else if (result == PosixResult.EAGAIN || result == PosixResult.EWOULDBLOCK)
                            {
                                if (!await Writable(tsocket))
                                {
                                    // TransportThread stopped
                                    break;
                                }
                            }
                            else
                            {
                                error = result.AsException();
                                break;
                            }
                        }
                    }
                    finally
                    {
                        // We need to call Advance to end the read
                        reader.Advance(end);
                    }
                }
            }
            catch (Exception ex)
            {
                error = ex;
            }
            finally
            {
                tsocket.ConnectionContext.OnConnectionClosed(error);
                reader.Complete(error);

                tsocket.StopReadFromSocket();

                CleanupSocketEnd(tsocket);
            }
        }