/** * <summary> * Tries to send packet over network.</summary> * * <param name="msg">Message being sent.</param> * <exception cref="IOException">If client was closed before message was sent over network.</exception> */ private void sendPacket(GridClientRequest msg) { try { byte[] data = marshaller.Marshal(msg); byte[] size = U.ToBytes(40 + data.Length); byte[] head = new byte[1 + size.Length + 40 + data.Length]; // Prepare packet. head[0] = (byte)0x90; Array.Copy(size, 0, head, 1, 4); Array.Copy(GridClientUtils.ToBytes(msg.RequestId), 0, head, 5, 8); Array.Copy(GridClientUtils.ToBytes(msg.ClientId), 0, head, 13, 16); Array.Copy(GridClientUtils.ToBytes(msg.DestNodeId), 0, head, 29, 16); Array.Copy(data, 0, head, 45, data.Length); // Enqueue packet to send. lock (stream) { stream.Write(head, 0, head.Length); stream.Flush(); } lastPacketSndTime = U.Now; } catch (IOException e) { // In case of IOException we should shutdown the whole client since connection is broken. Close(false); throw new GridClientConnectionResetException("Failed to send message over network (will try to " + "reconnect): " + ServerAddress, e); } }
/** * <summary> * Makes request to server via tcp protocol and returns a future that will be completed when * response is received.</summary> * * <param name="msg">Message to request,</param> * <returns>Response object.</returns> * <exception cref="GridClientConnectionResetException">If request failed.</exception> * <exception cref="GridClientClosedException">If client was closed.</exception> */ private IGridClientFuture <T> makeRequest <T>(GridClientRequest msg) { Dbg.Assert(msg != null); GridClientTcpRequestFuture <T> res = new GridClientTcpRequestFuture <T>(msg); makeRequest(res); return(res); }
/** * <summary> * Wraps any request into a protocol message.</summary> * * <param name="req">Request service information (headers).</param> * <param name="bean">Data bean to send.</param> * <returns>Wrapped message.</returns> */ private static ProtoRequest WrapRequest(GridClientRequest req, IMessage bean) { var builder = ProtoRequest.CreateBuilder() //.SetRequestId(req.RequestId) //.SetClientId(WrapGuid(req.ClientId)) .SetBody(bean.ToByteString()); if (req.SessionToken != null) { builder.SetSessionToken(ByteString.CopyFrom(req.SessionToken)); } return(builder.Build()); }
/** * <summary> * Tries to send packet over network.</summary> * * <param name="msg">Message being sent.</param> * <exception cref="IOException">If client was closed before message was sent over network.</exception> */ private void sendPacket(GridClientRequest msg) { try { MemoryStream buf = new MemoryStream(1024); // Header. buf.WriteByte((byte)0x90); // Reserve place for size. buf.WriteByte((byte)0); buf.WriteByte((byte)0); buf.WriteByte((byte)0); buf.WriteByte((byte)0); buf.Write(GridClientUtils.ToBytes(msg.RequestId), 0, 8); buf.Write(GridClientUtils.ToBytes(msg.ClientId), 0, 16); buf.Write(GridClientUtils.ToBytes(msg.DestNodeId), 0, 16); marshaller.Marshal(msg, buf); int len = (int)buf.Length; buf.Seek(1, SeekOrigin.Begin); buf.Write(U.ToBytes(len - 1 - 4), 0, 4); buf.Position = len; q.Add(buf); } catch (Exception e) { // In case of Exception we should shutdown the whole client since connection is broken // and future for this reques will never be completed. Close(false); throw new GridClientConnectionResetException("Failed to send message over network (will try to " + "reconnect): " + ServerAddress, e); } }
/** * <param name="msg">Message to send.</param> */ public GridClientTcpRequestFuture(GridClientRequest msg) { this.msg = msg; State = INITIAL; }