SslStream.BeginRead(Byte[], Int32, Int32, AsyncCallback, Object) Methode

Definition

Startet einen asynchronen Lesevorgang, der Daten aus dem Datenstrom liest und im angegebenen Array speichert.

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);
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

Parameter

buffer
Byte[]

Ein Byte Array, das die aus dem Datenstrom gelesenen Bytes empfängt.

offset
Int32

Der nullbasierte Speicherort, an buffer dem die Auslesedaten aus diesem Datenstrom gespeichert werden sollen.

count
Int32

Die maximale Anzahl von Bytes, die aus dem Datenstrom gelesen werden sollen.

asyncCallback
AsyncCallback

Ein AsyncCallback Delegat, der auf die Methode verweist, die aufgerufen werden soll, wenn der Lesevorgang abgeschlossen ist.

asyncState
Object

Ein benutzerdefiniertes Objekt, das Informationen zum Lesevorgang enthält. Dieses Objekt wird an den asyncCallback Delegaten übergeben, wenn der Vorgang abgeschlossen ist.

Gibt zurück

Ein IAsyncResult Objekt, das den Status des asynchronen Vorgangs angibt.

Ausnahmen

buffer ist null.

offset ist kleiner als 0 (null).

-oder-

offset ist größer als die Länge von buffer.

-oder-

offset + Anzahl ist größer als die Länge von buffer.

Fehler beim Lesevorgang.

-oder-

Verschlüsselung wird verwendet, aber die Daten konnten nicht entschlüsselt werden.

Es wird bereits ein Lesevorgang ausgeführt.

Dieses Objekt wurde geschlossen.

Die Authentifizierung ist nicht aufgetreten.

Beispiele

Im folgenden Codebeispiel wird das Starten eines asynchronen Lesevorgangs veranschaulicht.

// 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 = (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

Die folgende Methode wird aufgerufen, wenn der Lesevorgang abgeschlossen ist.


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

Hinweise

Wenn Verschlüsselung und Signatur aktiviert sind, liest der Lesevorgang die Daten aus dem zugrunde liegenden Datenstrom, überprüft die Integrität der Daten und/oder entschlüsselt sie. Der asynchrone Lesevorgang muss durch Aufrufen der EndRead Methode abgeschlossen werden. In der asyncCallback Regel wird die Methode vom Delegaten aufgerufen.

Diese Methode blockiert nicht, während der Vorgang abgeschlossen ist. Um zu blockieren, bis der Vorgang abgeschlossen ist, verwenden Sie die Read Methode.

Ausführliche Informationen zur Verwendung des asynchronen Programmiermodells finden Sie unter asynchrones Aufrufen synchroner Methoden

Die SslStream Klasse unterstützt nicht mehrere gleichzeitige Lesevorgänge.

Sie können diese Methode erst aufrufen, nachdem Sie sich erfolgreich authentifiziert haben. Zum Authentifizieren rufen Sie eine der AuthenticateAsClientMethoden oder Methoden oder BeginAuthenticateAsClientMethoden AuthenticateAsServerBeginAuthenticateAsServer auf.

Gilt für: