次の方法で共有


SocketAsyncEventArgs.SetBuffer メソッド

定義

非同期ソケット メソッドで使用するデータ バッファーを初期化します。

オーバーロード

SetBuffer(Memory<Byte>)

非同期ソケット メソッドでバッファーとして使用するメモリ領域を設定します。

SetBuffer(Int32, Int32)

非同期ソケット メソッドで使用するデータ バッファーを設定します。

SetBuffer(Byte[], Int32, Int32)

非同期ソケット メソッドで使用するデータ バッファーを設定します。

注釈

このメソッドは、 プロパティを Buffer null に設定し、 Count プロパティと Offset プロパティを 0 に設定します。

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、プロパティbufferCount長さに設定し、 プロパティを Offset 0 に設定します。

適用対象

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組み合わせは、 プロパティのバッファー配列の境界内にあるBuffer必要countがあります。

このメソッドは、 プロパティを Count パラメーターに count 設定し、 プロパティを Offset パラメーターに offset 設定します。 プロパティが Buffer null の場合、このメソッドは パラメーターと count パラメーターをoffset無視し、 プロパティと Count プロパティを Offset 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 プロパティが null ではなく、BufferList プロパティも null ではない場合に発生します。

引数が範囲外です。 この例外は、offset パラメーターがゼロ未満であるか、Buffer プロパティの配列の長さよりも大きい場合に発生します。 また、count パラメーターがゼロ未満であるか、Buffer プロパティの配列の長さから offset パラメーターを引いた長さよりも大きい場合にも、この例外が発生します。

次のコード例では、分割して各ソケット I/O 操作で使用するオブジェクトに SocketAsyncEventArgs 割り当てることができる 1 つの大きなバッファーを作成します。 これにより、バッファーを簡単に再利用し、フラグメント化ヒープ メモリから保護できます。

// 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 パラメーターを負の数値にすることはできません。 パラメーターと count パラメーターのoffset組み合わせは、 パラメーター内のデータ配列の境界内にあるbuffer必要があります。

このメソッドは、 プロパティを Buffer パラメーターに buffer 、プロパティを Count パラメーターに count 設定し、 プロパティを Offset パラメーターに offset 設定します。

こちらもご覧ください

適用対象