CopyFrom() public méthode

public CopyFrom ( byte bytes, int start, FrameHeader verifier ) : void
bytes byte
start int
verifier FrameHeader
Résultat void
        public async ValueTask <byte[]?> ReadMessageAsync <TAdapter>(TAdapter adapter) where TAdapter : IReadWriteAdapter
        {
            if (_eof)
            {
                return(null);
            }

            byte[] buffer = _readHeaderBuffer;

            int bytesRead;
            int offset = 0;

            while (offset < buffer.Length)
            {
                bytesRead = await adapter.ReadAsync(buffer.AsMemory(offset)).ConfigureAwait(false);

                if (bytesRead == 0)
                {
                    if (offset == 0)
                    {
                        // m_Eof, return null
                        _eof = true;
                        return(null);
                    }

                    throw new IOException(SR.Format(SR.net_io_readfailure, SR.net_io_connectionclosed));
                }

                offset += bytesRead;
            }

            _curReadHeader.CopyFrom(buffer, 0);
            if (_curReadHeader.PayloadSize > FrameHeader.MaxMessageSize)
            {
                throw new InvalidOperationException(SR.Format(SR.net_frame_size,
                                                              FrameHeader.MaxMessageSize,
                                                              _curReadHeader.PayloadSize.ToString(NumberFormatInfo.InvariantInfo)));
            }

            buffer = new byte[_curReadHeader.PayloadSize];

            offset = 0;
            while (offset < buffer.Length)
            {
                bytesRead = await adapter.ReadAsync(buffer.AsMemory(offset)).ConfigureAwait(false);

                if (bytesRead == 0)
                {
                    throw new IOException(SR.Format(SR.net_io_readfailure, SR.net_io_connectionclosed));
                }

                offset += bytesRead;
            }
            return(buffer);
        }
Exemple #2
0
        public async ValueTask <byte[]?> ReadMessageAsync <TAdapter>(Stream stream, CancellationToken cancellationToken)
            where TAdapter : IReadWriteAdapter
        {
            if (_eof)
            {
                return(null);
            }

            byte[] buffer = _readHeaderBuffer;

            int bytesRead = await TAdapter.ReadAtLeastAsync(
                stream, buffer, buffer.Length, throwOnEndOfStream : false, cancellationToken).ConfigureAwait(false);

            if (bytesRead < buffer.Length)
            {
                if (bytesRead == 0)
                {
                    // m_Eof, return null
                    _eof = true;
                    return(null);
                }
                throw new IOException(SR.Format(SR.net_io_readfailure, SR.net_io_connectionclosed));
            }

            _curReadHeader.CopyFrom(buffer, 0);
            if (_curReadHeader.PayloadSize > FrameHeader.MaxMessageSize)
            {
                throw new InvalidOperationException(SR.Format(SR.net_frame_size,
                                                              FrameHeader.MaxMessageSize,
                                                              _curReadHeader.PayloadSize.ToString(NumberFormatInfo.InvariantInfo)));
            }

            buffer = new byte[_curReadHeader.PayloadSize];

            if (buffer.Length > 0)
            {
                bytesRead = await TAdapter.ReadAtLeastAsync(
                    stream, buffer, buffer.Length, throwOnEndOfStream : false, cancellationToken).ConfigureAwait(false);

                if (bytesRead < buffer.Length)
                {
                    throw new IOException(SR.Format(SR.net_io_readfailure, SR.net_io_connectionclosed));
                }
            }
            return(buffer);
        }