void SendHeader() { byte[] header = new byte[] { (byte)'A', (byte)'M', (byte)'Q', (byte)'P', 0, 1, 0, 0 }; this.writer.Send(new ByteBuffer(header, 0, header.Length, header.Length)); Trace.WriteLine(TraceLevel.Frame, "SEND AMQP 0 1.0.0"); Trace.WriteBuffer("SEND {0}", header, 0, header.Length); }
public async Task PumpAsync(uint maxFrameSize, Func <ProtocolHeader, bool> onHeader, Func <ByteBuffer, bool> onBuffer) { byte[] header = new byte[FixedWidth.ULong]; if (onHeader != null) { // header await this.ReceiveBufferAsync(header, 0, FixedWidth.ULong).ConfigureAwait(false); Trace.WriteBuffer("RECV {0}", header, 0, header.Length); if (!onHeader(ProtocolHeader.Create(header, 0))) { return; } } // frames while (true) { await this.ReceiveBufferAsync(header, 0, FixedWidth.UInt).ConfigureAwait(false); int frameSize = AmqpBitConverter.ReadInt(header, 0); if ((uint)frameSize > maxFrameSize) { throw new AmqpException(ErrorCode.InvalidField, Fx.Format(SRAmqp.InvalidFrameSize, frameSize, maxFrameSize)); } ByteBuffer buffer = this.bufferManager.GetByteBuffer(frameSize); try { Buffer.BlockCopy(header, 0, buffer.Buffer, buffer.Offset, FixedWidth.UInt); await this.ReceiveBufferAsync(buffer.Buffer, buffer.Offset + FixedWidth.UInt, frameSize - FixedWidth.UInt).ConfigureAwait(false); buffer.Append(frameSize); Trace.WriteBuffer("RECV {0}", buffer.Buffer, buffer.Offset, buffer.Length); if (!onBuffer(buffer)) { break; } } finally { buffer.ReleaseReference(); } } }
internal void SendCommand(ushort channel, DescribedList command) { if (command.Descriptor.Code == Codec.Close.Code || this.state < ConnectionState.CloseSent) { ByteBuffer buffer = this.AllocateBuffer(Frame.CmdBufferSize); Frame.Encode(buffer, FrameType.Amqp, channel, command); this.writer.Send(buffer); Trace.WriteLine(TraceLevel.Frame, "SEND (ch={0}) {1}", channel, command); Trace.WriteBuffer("SEND {0}", buffer.Buffer, buffer.Offset, buffer.Length); if (this.heartBeat != null) { this.heartBeat.OnSend(); } } }
internal int SendCommand(ushort channel, Transfer transfer, bool first, ByteBuffer payload, int reservedBytes) { this.ThrowIfClosed("Send"); ByteBuffer buffer = this.AllocateBuffer(Frame.CmdBufferSize); Frame.Encode(buffer, FrameType.Amqp, channel, transfer); int payloadSize = payload.Length; int frameSize = buffer.Length + payloadSize; bool more = frameSize > this.remoteMaxFrameSize; if (more) { transfer.More = true; buffer.Reset(); Frame.Encode(buffer, FrameType.Amqp, channel, transfer); frameSize = (int)this.remoteMaxFrameSize; payloadSize = frameSize - buffer.Length; } AmqpBitConverter.WriteInt(buffer.Buffer, buffer.Offset, frameSize); ByteBuffer frameBuffer; if (first && !more && reservedBytes >= buffer.Length) { // optimize for most common case: single-transfer message frameBuffer = this.WrapBuffer(payload, payload.Offset - buffer.Length, frameSize); Array.Copy(buffer.Buffer, buffer.Offset, frameBuffer.Buffer, frameBuffer.Offset, buffer.Length); buffer.ReleaseReference(); } else { AmqpBitConverter.WriteBytes(buffer, payload.Buffer, payload.Offset, payloadSize); frameBuffer = buffer; } payload.Complete(payloadSize); this.writer.Send(frameBuffer); Trace.WriteLine(TraceLevel.Frame, "SEND (ch={0}) {1} payload {2}", channel, transfer, payloadSize); Trace.WriteBuffer("SEND {0}", frameBuffer.Buffer, frameBuffer.Offset, frameBuffer.Length); return(payloadSize); }