Exemplo n.º 1
0
        /// <summary>
        /// Reads data from the network stream.
        /// </summary>
        /// <param name="buffer">The buffer to store data to.</param>
        /// <param name="offset">The location in the <i>buffer</i> where to start storing the received data.</param>
        /// <param name="size">The number of bytes to read.</param>
        /// <returns>The number of bytes read from the network stream.</returns>
        ///
        /// <exception cref="System.ObjectDisposedException">
        /// The <see cref="BytesRoad.Net.Sockets.NetworkStreamEx"/> object was disposed.
        /// </exception>
        ///
        /// <exception cref="System.ArgumentNullException">
        /// <i>buffer</i> is a null reference (<b>Nothing</b> in Visual Basic).
        /// </exception>
        ///
        /// <exception cref="System.ArgumentOutOfRangeException">
        /// <i>offset</i> is less than 0.
        /// <para>-or-</para>
        /// <i>offset</i> is greater than the length of <i>buffer</i>.
        /// <para>-or-</para>
        /// <i>size</i> is less than 0.
        /// <para>-or-</para>
        /// <i>size</i> is greater than the length of <i>buffer</i> minus
        /// the value of the <i>offset</i> parameter.
        /// </exception>
        ///
        /// <exception cref="System.Net.Sockets.SocketException">
        /// An error occurred when attempting to access
        /// the socket which is used to complete the requested operation.
        /// </exception>
        /// <remarks>
        /// If no data is available for reading, the <b>Read</b> method will block
        /// until data is available. You can use the
        /// <see cref="BytesRoad.Net.Sockets.NetworkStreamEx.DataAvailable"/>
        /// property to determine if data is available for reading. When
        /// <see cref="BytesRoad.Net.Sockets.NetworkStreamEx.DataAvailable"/>
        /// is non-zero, retry the receive operation.
        /// <para>
        /// The <b>Read</b> method will
        /// read as much data as specified by <i>size</i> parameter. If
        /// the remote host shuts down the
        /// <see cref="BytesRoad.Net.Sockets.SocketEx"/>
        /// connection with the
        /// <see cref="BytesRoad.Net.Sockets.SocketEx.Shutdown"/>
        /// method, and all available data has been received, the <b>Read</b> method
        /// will complete and return number of bytes was read.
        /// </para>
        /// <note>
        /// The <b>NetworkStreamEx</b> should have access right to read data from the network stream.
        /// You may use <see cref="BytesRoad.Net.Sockets.NetworkStreamEx.CanRead"/> property to check this.
        /// </note>
        /// </remarks>
        public override int Read(byte[] buffer, int offset, int size)
        {
            CheckDisposed();
            _asyncCtx.SetProgress(true);
            try
            {
                int read = 0;
                int num  = 1;
                while ((num > 0) && (read < size))
                {
                    num   = _socket.Receive(buffer, offset + read, size - read);
                    read += num;
                }

                return(read);
            }
            catch
            {
                CheckDisposed();
                throw;
            }
            finally
            {
                _asyncCtx.SetProgress(false);
            }
        }