예제 #1
0
 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);
         }
     });
 }
예제 #2
0
        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);
        }
예제 #3
0
        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;
        }