Поделиться через


SocketAsyncEventArgs.SetBuffer Метод

Определение

Выполняет инициализацию буфера данных для применения в асинхронном методе сокета.

Перегрузки

SetBuffer(Memory<Byte>)

Задает область памяти, используемую в качестве буфера с асинхронным методом сокета.

SetBuffer(Int32, Int32)

Задает буфер данных для применения в асинхронном методе сокета.

SetBuffer(Byte[], Int32, Int32)

Задает буфер данных для применения в асинхронном методе сокета.

Комментарии

Этот метод задает Buffer для свойства значение NULL, а Count для свойств и Offset — нулевое значение.

SetBuffer(Memory<Byte>)

Исходный код:
SocketAsyncEventArgs.cs
Исходный код:
SocketAsyncEventArgs.cs
Исходный код:
SocketAsyncEventArgs.cs

Задает область памяти, используемую в качестве буфера с асинхронным методом сокета.

public:
 void SetBuffer(Memory<System::Byte> buffer);
public void SetBuffer (Memory<byte> buffer);
member this.SetBuffer : Memory<byte> -> unit
Public Sub SetBuffer (buffer As Memory(Of Byte))

Параметры

buffer
Memory<Byte>

Область памяти, используемая в качестве буфера с асинхронным методом сокета.

Комментарии

Этот метод задает MemoryBuffer для свойства buffer значение параметра , для Count свойства — длину buffer , а для Offset свойства — нулевое значение.

Применяется к

SetBuffer(Int32, Int32)

Исходный код:
SocketAsyncEventArgs.cs
Исходный код:
SocketAsyncEventArgs.cs
Исходный код:
SocketAsyncEventArgs.cs

Задает буфер данных для применения в асинхронном методе сокета.

public:
 void SetBuffer(int offset, int count);
public void SetBuffer (int offset, int count);
member this.SetBuffer : int * int -> unit
Public Sub SetBuffer (offset As Integer, count As Integer)

Параметры

offset
Int32

Смещение (в байтах) в буфере данных, при котором начинается операция.

count
Int32

Максимальное количество данных (в байтах), которое может быть отправлено или получено в буфере.

Исключения

Аргумент вне диапазона. Это исключение возникает, если значение параметра offset меньше нуля или больше длины массива, указанной в свойстве Buffer. Это исключение возникает также, если значение параметра count меньше нуля или больше разницы между длиной массива, указанной в свойстве Buffer, и значением параметра offset.

Комментарии

Параметры offset и count не могут быть отрицательными числами. Сочетание offset параметров и count должно находиться в границах буферного массива в свойстве Buffer .

Этот метод задает свойству Count значение параметра , count а свойству Offset — параметр .offset Buffer Если свойство имеет значение NULL, этот метод игнорирует offset параметры и count и устанавливает Offset для свойств и Count значение 0.

Этот метод не изменяет Buffer свойство .

См. также раздел

Применяется к

SetBuffer(Byte[], Int32, Int32)

Исходный код:
SocketAsyncEventArgs.cs
Исходный код:
SocketAsyncEventArgs.cs
Исходный код:
SocketAsyncEventArgs.cs

Задает буфер данных для применения в асинхронном методе сокета.

public:
 void SetBuffer(cli::array <System::Byte> ^ buffer, int offset, int count);
public void SetBuffer (byte[] buffer, int offset, int count);
public void SetBuffer (byte[]? buffer, int offset, int count);
member this.SetBuffer : byte[] * int * int -> unit
Public Sub SetBuffer (buffer As Byte(), offset As Integer, count As Integer)

Параметры

buffer
Byte[]

Буфер данных для применения в асинхронном методе сокета.

offset
Int32

Смещение (в байтах) в буфере данных, при котором начинается операция.

count
Int32

Максимальное количество данных (в байтах), которое может быть отправлено или получено в буфере.

Исключения

Неоднозначное указание буферов. Это исключение возникает, если значения свойств Buffer и BufferList одновременно отличны от null.

Аргумент вне диапазона. Это исключение возникает, если значение параметра offset меньше нуля или больше длины массива, указанной в свойстве Buffer. Это исключение возникает также, если значение параметра count меньше нуля или больше разницы между длиной массива, указанной в свойстве Buffer, и значением параметра offset.

Примеры

В следующем примере кода создается один большой буфер, который можно разделить и назначить SocketAsyncEventArgs объектам для использования с каждой операцией ввода-вывода сокета. Это позволяет легко повторно использовать буферы и защищает от фрагментирования памяти кучи.

// This class creates a single large buffer which can be divided up
// and assigned to SocketAsyncEventArgs objects for use with each
// socket I/O operation.
// This enables bufffers to be easily reused and guards against
// fragmenting heap memory.
//
// The operations exposed on the BufferManager class are not thread safe.
class BufferManager
{
    int m_numBytes;                 // the total number of bytes controlled by the buffer pool
    byte[] m_buffer;                // the underlying byte array maintained by the Buffer Manager
    Stack<int> m_freeIndexPool;     //
    int m_currentIndex;
    int m_bufferSize;

    public BufferManager(int totalBytes, int bufferSize)
    {
        m_numBytes = totalBytes;
        m_currentIndex = 0;
        m_bufferSize = bufferSize;
        m_freeIndexPool = new Stack<int>();
    }

    // Allocates buffer space used by the buffer pool
    public void InitBuffer()
    {
        // create one big large buffer and divide that
        // out to each SocketAsyncEventArg object
        m_buffer = new byte[m_numBytes];
    }

    // Assigns a buffer from the buffer pool to the
    // specified SocketAsyncEventArgs object
    //
    // <returns>true if the buffer was successfully set, else false</returns>
    public bool SetBuffer(SocketAsyncEventArgs args)
    {

        if (m_freeIndexPool.Count > 0)
        {
            args.SetBuffer(m_buffer, m_freeIndexPool.Pop(), m_bufferSize);
        }
        else
        {
            if ((m_numBytes - m_bufferSize) < m_currentIndex)
            {
                return false;
            }
            args.SetBuffer(m_buffer, m_currentIndex, m_bufferSize);
            m_currentIndex += m_bufferSize;
        }
        return true;
    }

    // Removes the buffer from a SocketAsyncEventArg object.
    // This frees the buffer back to the buffer pool
    public void FreeBuffer(SocketAsyncEventArgs args)
    {
        m_freeIndexPool.Push(args.Offset);
        args.SetBuffer(null, 0, 0);
    }
}

Комментарии

Параметры offset и count не могут быть отрицательными числами. Сочетание offset параметров и count должно находиться в границах массива данных в параметре buffer .

Этот метод задает Buffer для свойства buffer значение параметра , для Count свойства — count параметр , а для Offset свойства — для offset параметра .

См. также раздел

Применяется к