/// <summary> /// Writes the message to a byte array. /// </summary> private RequestMessage WriteMessage(Action <ClientRequestContext> writeAction, ClientOp opId) { _features.ValidateOp(opId); var requestId = Interlocked.Increment(ref _requestId); // Potential perf improvements: // * ArrayPool<T> // * Write to socket stream directly (not trivial because of unknown size) var stream = new BinaryHeapStream(256); stream.WriteInt(0); // Reserve message size. stream.WriteShort((short)opId); stream.WriteLong(requestId); if (writeAction != null) { var ctx = new ClientRequestContext(stream, this); writeAction(ctx); ctx.FinishMarshal(); } stream.WriteInt(0, stream.Position - 4); // Write message size. return(new RequestMessage(requestId, stream.GetArray(), stream.Position)); }
/// <summary> /// Writes the message to a byte array. /// </summary> private static byte[] WriteMessage(Action <IBinaryStream> writeAction, int bufSize, out int messageLen) { var stream = new BinaryHeapStream(bufSize); stream.WriteInt(0); // Reserve message size. writeAction(stream); stream.WriteInt(0, stream.Position - 4); // Write message size. messageLen = stream.Position; return(stream.GetArray()); }
/// <summary> /// Sends the request. /// </summary> private static void SendRequest(Stream sock, Action <BinaryHeapStream> writeAction) { using (var stream = new BinaryHeapStream(128)) { stream.WriteInt(0); // Reserve message size. writeAction(stream); stream.WriteInt(0, stream.Position - 4); // Write message size. sock.Write(stream.GetArray(), 0, stream.Position); } }
/// <summary> /// Writes the message to a byte array. /// </summary> private RequestMessage WriteMessage(Action <IBinaryStream> writeAction, ClientOp opId) { var requestId = Interlocked.Increment(ref _requestId); var stream = new BinaryHeapStream(256); stream.WriteInt(0); // Reserve message size. stream.WriteShort((short)opId); stream.WriteLong(requestId); writeAction(stream); stream.WriteInt(0, stream.Position - 4); // Write message size. return(new RequestMessage(requestId, stream.GetArray(), stream.Position)); }
/// <summary> /// Sends the request. /// </summary> private static int SendRequest(Socket sock, Action <BinaryHeapStream> writeAction) { using (var stream = new BinaryHeapStream(128)) { stream.WriteInt(0); // Reserve message size. writeAction(stream); stream.WriteInt(0, stream.Position - 4); // Write message size. return(sock.Send(stream.GetArray(), stream.Position, SocketFlags.None)); } }
/// <summary> /// Writes the message to a byte array. /// </summary> private RequestMessage WriteMessage(Action <IBinaryStream> writeAction, ClientOp opId) { ValidateOp(opId); var requestId = Interlocked.Increment(ref _requestId); // Potential perf improvements: // * ArrayPool<T> // * Write to socket stream directly (not trivial because of unknown size) var stream = new BinaryHeapStream(256); stream.WriteInt(0); // Reserve message size. stream.WriteShort((short)opId); stream.WriteLong(requestId); writeAction(stream); stream.WriteInt(0, stream.Position - 4); // Write message size. return(new RequestMessage(requestId, stream.GetArray(), stream.Position)); }