public void SendMessage(TransactionMessage message) { // Ensure that we aren't going to run over memory if (message.DataBuffer.Length < message.DataOffset + message.DataLength) { throw new ArgumentException("DataOffset + DataLength > Message Buffer size"); } if (message.DataOffset < 0 || message.DataLength < 0) { throw new ArgumentException("Either DataOffset or DataLength was negative"); } // if (message.DataLength + 4 + 4 > DTPConstants.kMaxMessageSize) // throw new ArgumentException("Frame (header + payload) was too big (> max size)"); // Take frame buffer and copy contents to it int frameSize = 4 + 4 + message.DataLength; var frameBuffer = TakeFrameBuffer(frameSize); fixed(byte *pFrameBuffer = frameBuffer) fixed(byte *pMessageBuffer = message.DataBuffer) { *(uint *)(pFrameBuffer + 0) = (uint)frameSize; *(uint *)(pFrameBuffer + 4) = (uint)message.TransactionId; byte *pMessageContent = pMessageBuffer + message.DataOffset; byte *pFrameBufferContent = pFrameBuffer + 8; memcpy(new IntPtr(pFrameBufferContent), new IntPtr(pMessageContent), message.DataLength); } m_frameBuffersToSend.Add(frameBuffer); }
/// <summary> /// Processes a message recieved from the remote endpoint /// </summary> /// <param name="session"> /// DSPEx session object, which permits us to send messages. /// </param> /// <param name="message"> /// The recieved DSPEx message which we are to process. /// </param> public abstract void ProcessMessage(IDSPExSession session, TransactionMessage message);