private WebSocketBuffer(ArraySegment<byte> internalBuffer, int receiveBufferSize, int sendBufferSize)
{
Debug.Assert(internalBuffer != null, "'internalBuffer' MUST NOT be NULL.");
Debug.Assert(receiveBufferSize >= MinReceiveBufferSize,
"'receiveBufferSize' MUST be at least " + MinReceiveBufferSize.ToString(NumberFormatInfo.InvariantInfo) + ".");
Debug.Assert(sendBufferSize >= MinSendBufferSize,
"'sendBufferSize' MUST be at least " + MinSendBufferSize.ToString(NumberFormatInfo.InvariantInfo) + ".");
Debug.Assert(receiveBufferSize <= MaxBufferSize,
"'receiveBufferSize' MUST NOT exceed " + MaxBufferSize.ToString(NumberFormatInfo.InvariantInfo) + ".");
Debug.Assert(sendBufferSize <= MaxBufferSize,
"'sendBufferSize' MUST NOT exceed " + MaxBufferSize.ToString(NumberFormatInfo.InvariantInfo) + ".");
_receiveBufferSize = receiveBufferSize;
_sendBufferSize = sendBufferSize;
_internalBuffer = internalBuffer;
_gcHandle = GCHandle.Alloc(internalBuffer.Array, GCHandleType.Pinned);
// Size of the internal buffer owned exclusively by the WSPC.
int nativeBufferSize = _receiveBufferSize + _sendBufferSize + NativeOverheadBufferSize;
_startAddress = Marshal.UnsafeAddrOfPinnedArrayElement(internalBuffer.Array, internalBuffer.Offset).ToInt64();
_endAddress = _startAddress + nativeBufferSize;
_nativeBuffer = new ArraySegment<byte>(internalBuffer.Array, internalBuffer.Offset, nativeBufferSize);
_payloadBuffer = new ArraySegment<byte>(internalBuffer.Array,
_nativeBuffer.Offset + _nativeBuffer.Count,
_receiveBufferSize);
_propertyBuffer = new ArraySegment<byte>(internalBuffer.Array,
_payloadBuffer.Offset + _payloadBuffer.Count,
s_PropertyBufferSize);
_sendBufferState = SendBufferState.None;
}