SslStream.BeginRead(Byte[], Int32, Int32, AsyncCallback, Object) 메서드
정의
중요
일부 정보는 릴리스되기 전에 상당 부분 수정될 수 있는 시험판 제품과 관련이 있습니다. Microsoft는 여기에 제공된 정보에 대해 어떠한 명시적이거나 묵시적인 보증도 하지 않습니다.
스트림에서 데이터를 읽어 지정된 배열에 저장하는 비동기 읽기 작업을 시작합니다.
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
매개 변수
- offset
- Int32
이 스트림에서 읽은 데이터를 저장하기 시작하는, buffer
내의 0부터 시작하는 위치입니다.
- count
- Int32
스트림에서 읽을 최대 바이트 수입니다.
- asyncCallback
- AsyncCallback
읽기 작업이 완료되었을 때 호출할 메서드를 참조하는 AsyncCallback 대리자입니다.
- asyncState
- Object
읽기 작업에 대한 정보가 들어 있는 사용자 정의 개체입니다. 작업이 완료되면 asyncCallback
대리자에게 전달되는 개체입니다.
반환
비동기 작업의 상태를 나타내는 IAsyncResult 개체입니다.
예외
buffer
이(가) null
인 경우
offset
가 0보다 작은 경우
또는
offset
이 buffer
의 길이보다 큽니다.
또는
offset
과 count의 합이 buffer
길이보다 큽니다.
읽기 작업을 진행 중인 경우
이 개체가 닫힌 경우.
인증이 수행되지 않은 경우
예제
다음 코드 예제에서는 비동기 읽기 작업을 시작하는 방법을 보여 줍니다.
// 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
읽기가 완료되면 다음 메서드가 호출됩니다.
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
설명
암호화 및 또는 서명을 사용하는 경우 읽기 작업은 기본 스트림에서 데이터를 읽고, 데이터의 무결성을 검사하고, 암호를 해독합니다. 메서드를 호출 EndRead 하여 비동기 읽기 작업을 완료해야 합니다. 일반적으로 메서드는 대리자에서 호출됩니다 asyncCallback
.
이 메서드는 작업이 완료되는 동안 차단되지 않습니다. 작업이 완료될 때까지 차단하려면 메서드를 Read 사용합니다.
비동기 프로그래밍 모델 사용에 대한 자세한 내용은 동기 메서드 비동기 호출을 참조하세요.
클래스는 SslStream 여러 동시 읽기 작업을 지원하지 않습니다.
성공적으로 인증될 때까지 이 메서드를 호출할 수 없습니다. 인증하려면 , 또는 BeginAuthenticateAsClient, AuthenticateAsServerBeginAuthenticateAsServer 메서드 중 AuthenticateAsClient하나를 호출합니다.
적용 대상
.NET