private void SendInternal(IOState state) { if (!state.BandwidthController.CanTransmit(state.PendingBytes)) { _sendQueue.Add(state); return; } if (state.WaitingForBuffer) { state.Buffer = _bufferAllocator.Allocate(state.Bytes); if (state.WaitingForBuffer) { _sendQueue.Add(state); return; } } state.BandwidthController.SetTransmittion(state.PendingBytes); state.Connection.Send(state.GetBufferForPending(), (sentCount, success) => { try { if (success && sentCount > 0) { if (sentCount < state.PendingBytes) { state.PendingBytes -= sentCount; _sendQueue.Add(state); } else { var data = state.GetData(); state.SuccessCallback(data); } } else { state.FailureCallback(); } } finally { state.Release(); _bufferAllocator.Free(state.Buffer); } }); }
public virtual async Task WriteBytesAsync(byte[] bytes) { var msgLen = bytes.Length + 1; var buf = BufferAllocator.Allocate(msgLen); System.Buffer.BlockCopy(bytes, 0, buf.Array, buf.Offset, msgLen - 1); await Stream.WriteAsync(buf.Array, buf.Offset, msgLen); BufferAllocator.Free(buf); }
private async Task ReadBufferAsync() { if (Pos < End) { return; } BufferAllocator.Free(Buffer); Buffer = BufferAllocator.Allocate(BufferSize); Pos = 0; var readed = await Stream.ReadAsync(Buffer.Array, Buffer.Offset, Buffer.Count, new CancellationToken()); if (readed == 0) { throw new EndOfStreamException(); } End = readed; }