SslStream.BeginRead(Byte[], Int32, Int32, AsyncCallback, Object) Método
Definición
Importante
Parte de la información hace referencia a la versión preliminar del producto, que puede haberse modificado sustancialmente antes de lanzar la versión definitiva. Microsoft no otorga ninguna garantía, explícita o implícita, con respecto a la información proporcionada aquí.
Inicia una operación de lectura asincrónica que lee los datos de la secuencia y los almacena en la matriz especificada.
public:
override IAsyncResult ^ BeginRead(cli::array <System::Byte> ^ buffer, int offset, int count, AsyncCallback ^ asyncCallback, System::Object ^ asyncState);
public override IAsyncResult BeginRead (byte[] buffer, int offset, int count, AsyncCallback? asyncCallback, object? asyncState);
public override IAsyncResult BeginRead (byte[] buffer, int offset, int count, AsyncCallback asyncCallback, object asyncState);
override this.BeginRead : byte[] * int * int * AsyncCallback * obj -> IAsyncResult
Public Overrides Function BeginRead (buffer As Byte(), offset As Integer, count As Integer, asyncCallback As AsyncCallback, asyncState As Object) As IAsyncResult
Parámetros
- offset
- Int32
Posición de base cero de buffer
donde se comienzan a almacenar los datos leídos de esta secuencia.
- count
- Int32
Número máximo de bytes que se van a leer de la secuencia.
- asyncCallback
- AsyncCallback
Delegado de AsyncCallback que hace referencia al método que se va a invocar una vez finalizada la operación de lectura.
- asyncState
- Object
Objeto definido por el usuario que contiene información sobre la operación de lectura. Este objeto se pasa al delegado de asyncCallback
cuando la operación ha terminado.
Devoluciones
Un objeto IAsyncResult que indica el estado de la operación asincrónica.
Excepciones
buffer
es null
.
offset
es menor que cero.
O bien
offset
es mayor que la longitud de buffer
.
O bien
La suma de offset
y el recuento es mayor que la longitud de buffer
.
Se ha producido un error en la operación de lectura.
O bien
El cifrado está en uso, pero los datos no se pudieron descifrar.
Ya hay una operación de lectura en curso.
Este objeto se ha cerrado.
No se ha producido la autenticación.
Ejemplos
En el ejemplo de código siguiente se muestra cómo iniciar una operación de lectura asincrónica.
// readData and buffer holds the data read from the server.
// They is used by the ReadCallback method.
static StringBuilder^ readData = gcnew StringBuilder;
static array<Byte>^buffer = gcnew array<Byte>(2048);
// readData and buffer holds the data read from the server.
// They is used by the ReadCallback method.
static StringBuilder readData = new StringBuilder();
static byte [] buffer = new byte[2048];
' readData and buffer holds the data read from the server.
' They is used by the ReadCallback method.
Shared readData As New StringBuilder()
Shared buffer As Byte() = New Byte(2048) {}
static void WriteCallback( IAsyncResult^ ar )
{
SslStream^ stream = dynamic_cast<SslStream^>(ar->AsyncState);
try
{
Console::WriteLine( L"Writing data to the server." );
stream->EndWrite( ar );
// Asynchronously read a message from the server.
stream->BeginRead( buffer, 0, buffer->Length, gcnew AsyncCallback( ReadCallback ), stream );
}
catch ( Exception^ writeException )
{
e = writeException;
complete = true;
return;
}
}
static void WriteCallback(IAsyncResult ar)
{
SslStream stream = (SslStream) ar.AsyncState;
try
{
Console.WriteLine("Writing data to the server.");
stream.EndWrite(ar);
// Asynchronously read a message from the server.
stream.BeginRead(buffer, 0, buffer.Length,
new AsyncCallback(ReadCallback),
stream);
}
catch (Exception writeException)
{
e = writeException;
complete = true;
return;
}
}
Shared Sub WriteCallback(ar As IAsyncResult)
Dim stream = CType(ar.AsyncState, SslStream)
Try
Console.WriteLine("Writing data to the server.")
stream.EndWrite(ar)
' Asynchronously read a message from the server.
stream.BeginRead(buffer, 0, buffer.Length, New AsyncCallback(AddressOf ReadCallback), stream)
Catch writeException As Exception
e = writeException
complete = True
Return
End Try
End Sub
Se llama al método siguiente cuando se completa la lectura.
static void ReadCallback( IAsyncResult^ ar )
{
// Read the message sent by the server.
// The end of the message is signaled using the
// "<EOF>" marker.
SslStream^ stream = dynamic_cast<SslStream^>(ar->AsyncState);
int byteCount = -1;
try
{
Console::WriteLine( L"Reading data from the server." );
byteCount = stream->EndRead( ar );
// Use Decoder class to convert from bytes to UTF8
// in case a character spans two buffers.
Decoder^ decoder = Encoding::UTF8->GetDecoder();
array<Char>^chars = gcnew array<Char>(decoder->GetCharCount( buffer, 0, byteCount ));
decoder->GetChars( buffer, 0, byteCount, chars, 0 );
readData->Append( chars );
// Check for EOF or an empty message.
if ( readData->ToString()->IndexOf( L"<EOF>" ) == -1 && byteCount != 0 )
{
// We are not finished reading.
// Asynchronously read more message data from the server.
stream->BeginRead( buffer, 0, buffer->Length, gcnew AsyncCallback( ReadCallback ), stream );
}
else
{
Console::WriteLine( L"Message from the server: {0}", readData );
}
}
catch ( Exception^ readException )
{
e = readException;
complete = true;
return;
}
complete = true;
}
static void ReadCallback(IAsyncResult ar)
{
// Read the message sent by the server.
// The end of the message is signaled using the
// "<EOF>" marker.
SslStream stream = (SslStream) ar.AsyncState;
int byteCount = -1;
try
{
Console.WriteLine("Reading data from the server.");
byteCount = stream.EndRead(ar);
// Use Decoder class to convert from bytes to UTF8
// in case a character spans two buffers.
Decoder decoder = Encoding.UTF8.GetDecoder();
char[] chars = new char[decoder.GetCharCount(buffer,0, byteCount)];
decoder.GetChars(buffer, 0, byteCount, chars,0);
readData.Append (chars);
// Check for EOF or an empty message.
if (readData.ToString().IndexOf("<EOF>") == -1 && byteCount != 0)
{
// We are not finished reading.
// Asynchronously read more message data from the server.
stream.BeginRead(buffer, 0, buffer.Length,
new AsyncCallback(ReadCallback),
stream);
}
else
{
Console.WriteLine("Message from the server: {0}", readData.ToString());
}
}
catch (Exception readException)
{
e = readException;
complete = true;
return;
}
complete = true;
}
Shared Sub ReadCallback(ar As IAsyncResult)
' Read the message sent by the server.
' The end of the message is signaled using the
' "<EOF>" marker.
Dim stream = CType(ar.AsyncState, SslStream)
Dim byteCount As Integer
Try
Console.WriteLine("Reading data from the server.")
byteCount = stream.EndRead(ar)
' Use Decoder class to convert from bytes to UTF8
' in case a character spans two buffers.
Dim decoder As Decoder = Encoding.UTF8.GetDecoder()
Dim chars = New Char(decoder.GetCharCount(buffer, 0, byteCount)) {}
decoder.GetChars(buffer, 0, byteCount, chars, 0)
readData.Append(chars)
' Check for EOF or an empty message.
If readData.ToString().IndexOf("<EOF>") = -1 AndAlso byteCount <> 0 Then
' We are not finished reading.
' Asynchronously read more message data from the server.
stream.BeginRead(buffer, 0, buffer.Length, New AsyncCallback(AddressOf ReadCallback), stream)
Else
Console.WriteLine("Message from the server: {0}", readData.ToString())
End If
Catch readException As Exception
e = readException
complete = True
Return
End Try
complete = True
End Sub
Comentarios
Si el cifrado y la firma están habilitados, la operación de lectura lee los datos de la secuencia subyacente, comprueba la integridad de los datos o lo descifra. La operación de lectura asincrónica debe completarse llamando al EndRead método . Normalmente, el delegado invoca el asyncCallback
método .
Este método no se bloquea mientras se completa la operación. Para bloquear hasta que finalice la operación, use el Read método .
Para obtener información detallada sobre el uso del modelo de programación asincrónica, vea Llamar a métodos sincrónicos de forma asincrónica.
La SslStream clase no admite varias operaciones de lectura simultáneas.
No puede llamar a este método hasta que se haya autenticado correctamente. Para autenticar una de las llamadas a uno de los AuthenticateAsClientmétodos , o BeginAuthenticateAsClient, AuthenticateAsServer. BeginAuthenticateAsServer