SslStream.BeginWrite(Byte[], Int32, Int32, AsyncCallback, Object) Метод
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Начинает асинхронную операцию записи, которая записывает байты (Byte) из указанного буфера в поток.
public:
override IAsyncResult ^ BeginWrite(cli::array <System::Byte> ^ buffer, int offset, int count, AsyncCallback ^ asyncCallback, System::Object ^ asyncState);
public override IAsyncResult BeginWrite (byte[] buffer, int offset, int count, AsyncCallback? asyncCallback, object? asyncState);
public override IAsyncResult BeginWrite (byte[] buffer, int offset, int count, AsyncCallback asyncCallback, object asyncState);
override this.BeginWrite : byte[] * int * int * AsyncCallback * obj -> IAsyncResult
Public Overrides Function BeginWrite (buffer As Byte(), offset As Integer, count As Integer, asyncCallback As AsyncCallback, asyncState As Object) As IAsyncResult
Параметры
- offset
- Int32
Расположение (начиная с нуля) в массивеbuffer
, с которого требуется начать считывать байты, предназначенные для записи в поток.
- count
- Int32
Значение Int32, определяющее количество байт, которые требуется считать из массива buffer
.
- asyncCallback
- AsyncCallback
Делегат AsyncCallback, ссылающийся на метод, который следует вызвать после завершения операции записи.
- asyncState
- Object
Пользовательский объект, содержащий сведения об операции записи. Этот объект передается делегату asyncCallback
после завершения операции.
Возвращаемое значение
Объект IAsyncResult, указывающий состояние асинхронной операции.
Исключения
buffer
имеет значение null
.
Значение параметра offset
меньше нуля.
-или-
Значение offset
превышает длину buffer
.
-или-
Сумма значений offset
и count превышает длину массива buffer
.
Не удалось выполнить операцию записи.
Уже существует выполняющаяся операция записи.
Объект закрыт.
Проверка подлинности не выполнялась.
Примеры
В следующем примере кода демонстрируется вызов этого метода.
void ReadCallback( IAsyncResult^ ar )
{
ClientState^ state = dynamic_cast<ClientState^>(ar->AsyncState);
SslStream^ stream = state->stream;
// Read the message sent by the client.
// The end of the message is signaled using the
// "<EOF>" marker.
int byteCount = -1;
try
{
Console::WriteLine( L"Reading data from the client." );
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( state->buffer, 0, byteCount ));
decoder->GetChars( state->buffer, 0, byteCount, chars, 0 );
state->readData->Append( chars );
// Check for EOF or an empty message.
if ( state->readData->ToString()->IndexOf( L"<EOF>" ) == -1 && byteCount != 0 )
{
// We are not finished reading.
// Asynchronously read more message data from the client.
stream->BeginRead( state->buffer, 0, state->buffer->Length, gcnew AsyncCallback( this, &SslTcpListener::ReadCallback ), state );
}
else
{
Console::WriteLine( L"Message from the client: {0}", state->readData );
}
// Encode a test message into a byte array.
// Signal the end of the message using "<EOF>".
array<Byte>^message = Encoding::UTF8->GetBytes( L"Hello from the server.<EOF>" );
// Asynchronously send the message to the client.
stream->BeginWrite( message, 0, message->Length, gcnew AsyncCallback( this, &SslTcpListener::WriteCallback ), state );
}
catch ( Exception^ readException )
{
Console::WriteLine( L"Read error: {0}", readException->Message );
state->Close();
return;
}
}
void ReadCallback(IAsyncResult ar)
{
ClientState state = (ClientState) ar.AsyncState;
SslStream stream = state.stream;
// Read the message sent by the client.
// The end of the message is signaled using the
// "<EOF>" marker.
int byteCount = -1;
try
{
Console.WriteLine("Reading data from the client.");
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(state.buffer,0, byteCount)];
decoder.GetChars(state.buffer, 0, byteCount, chars,0);
state.readData.Append (chars);
// Check for EOF or an empty message.
if (state.readData.ToString().IndexOf("<EOF>") == -1 && byteCount != 0)
{
// We are not finished reading.
// Asynchronously read more message data from the client.
stream.BeginRead(state.buffer, 0, state.buffer.Length,
new AsyncCallback(ReadCallback),
state);
}
else
{
Console.WriteLine("Message from the client: {0}", state.readData.ToString());
}
// Encode a test message into a byte array.
// Signal the end of the message using "<EOF>".
byte[] message = Encoding.UTF8.GetBytes("Hello from the server.<EOF>");
// Asynchronously send the message to the client.
stream.BeginWrite(message, 0, message.Length,
new AsyncCallback(WriteCallback),
state);
}
catch (Exception readException)
{
Console.WriteLine("Read error: {0}", readException.Message);
state.Close();
return;
}
}