public void SendTcp(Socket socket, ByteArrayReference buffer, ISerializer messageContents) { UInt32 messageContentLength = (messageContents == null) ? 0 : messageContents.SerializationLength(); UInt32 totalMessageLength = SerializationLength() + messageContentLength; buffer.EnsureCapacityNoCopy(4 + totalMessageLength); // Extra 4 bytes for the record header if (RpcPerformanceLog.rpcMessageSerializationLogger != null) { RpcPerformanceLog.StartSerialize(); } UInt32 offset = Serialize(buffer.array, 4); if (messageContents != null) { offset = messageContents.Serialize(buffer.array, offset); } if (RpcPerformanceLog.rpcMessageSerializationLogger != null) { RpcPerformanceLog.StopSerializationAndLog("RpcSerializationTime"); } if (offset != totalMessageLength + 4) { throw new InvalidOperationException(String.Format("[CodeBug] The caclulated serialization length of RpcMessage '{0}' was {1} but actual size was {2}", DataStringBuilder.DataString(this, new StringBuilder()), totalMessageLength, offset)); } // // Insert the record header // buffer.array[0] = (Byte)(0x80 | (totalMessageLength >> 24)); buffer.array[1] = (Byte)(totalMessageLength >> 16); buffer.array[2] = (Byte)(totalMessageLength >> 8); buffer.array[3] = (Byte)(totalMessageLength); socket.Send(buffer.array, 0, (Int32)(totalMessageLength + 4), SocketFlags.None); }