/// <summary> /// Send Service Initialize Command respose on optimal path if exception occured only for newer clients 4610. /// Backward compability handled for older version client. /// </summary> /// <param name="unOptBuffer"></param> /// <returns></returns> private IList GetOptimizedResponse(IList unOptBuffer) { if (cmdInfo.clientVersion < 4610) { return(unOptBuffer); } using (ClusteredMemoryStream stream = new ClusteredMemoryStream()) { byte[] dataSzBytes = new byte[ConnectionManager.MessageSizeHeader]; stream.Write(dataSzBytes, 0, ConnectionManager.MessageSizeHeader); int len = 0; foreach (byte[] buffBytes in unOptBuffer) { stream.Write(buffBytes, 0, buffBytes.Length); len += buffBytes.Length; } byte[] lengthBytes = HelperFxn.ToBytes(len.ToString()); stream.Seek(0, SeekOrigin.Begin); stream.Write(lengthBytes, 0, lengthBytes.Length); return(stream.GetInternalBuffer()); } }
internal static IList serializeMessage(Message msg) { int len = 0; byte[] buffie; FlagsByte flags = new FlagsByte(); msg.Dest = null; msg.Dests = null; RequestCorrelatorHDR rqHeader = (RequestCorrelatorHDR)msg.getHeader(HeaderType.REQUEST_COORELATOR); if (rqHeader != null) { rqHeader.serializeFlag = false; } ClusteredMemoryStream stmOut = new ClusteredMemoryStream(); stmOut.Write(Util.WriteInt32(len), 0, 4); stmOut.Write(Util.WriteInt32(len), 0, 4); if (msg.IsUserMsg) { BinaryWriter msgWriter = new BinaryWriter(stmOut, new UTF8Encoding(true)); flags.SetOn(FlagsByte.Flag.TRANS); msgWriter.Write(flags.DataByte); msg.SerializeLocal(msgWriter); } else { flags.SetOff(FlagsByte.Flag.TRANS); stmOut.WriteByte(flags.DataByte); CompactBinaryFormatter.Serialize(stmOut, msg, null, false); } len = (int)stmOut.Position - 4; int payloadLength = 0; // the user payload size. payload is passed on untill finally send on the socket. if (msg.Payload != null) { for (int i = 0; i < msg.Payload.Length; i++) { payloadLength += ((byte[])msg.Payload.GetValue(i)).Length; } len += payloadLength; } stmOut.Position = 0; stmOut.Write(Util.WriteInt32(len), 0, 4); stmOut.Write(Util.WriteInt32(len - 4 - payloadLength), 0, 4); return(stmOut.GetInternalBuffer()); }
public bool SendMessage(object message) { if (message == null) { throw new ArgumentNullException("message"); } //first serialize the message using channel formatter byte[] serailizedMessage = _formatter.Serialize(message); byte[] msgLength = UTF8Encoding.UTF8.GetBytes(serailizedMessage.Length.ToString()); //message is written in a specific order as expected by Socket server ClusteredMemoryStream stream = new ClusteredMemoryStream(); //stream.Position = 20;//skip discarding buffer stream.Write(msgLength, 0, msgLength.Length); stream.Position = 10; stream.Write(serailizedMessage, 0, serailizedMessage.Length); byte[] finalBuffer = stream.ToArray(); stream.Close(); try { if (EnsureConnected()) { try { _connection.Send(finalBuffer, 0, finalBuffer.Length); return(true); } catch (ConnectionException) { if (EnsureConnected()) { _connection.Send(finalBuffer, 0, finalBuffer.Length); return(true); } } } } catch (Exception e) { throw new ChannelException(e.Message, e); } return(false); }
public static ClusteredArrayList SerializeResponse(Alachisoft.NCache.Common.Protobuf.ManagementResponse command) { using (ClusteredMemoryStream stream = new ClusteredMemoryStream()) { //TODO byte[] size = new byte[10]; stream.Write(size, 0, size.Length); Serializer.Serialize <Alachisoft.NCache.Common.Protobuf.ManagementResponse>(stream, command); int messageLen = (int)stream.Length - size.Length; size = UTF8Encoding.UTF8.GetBytes(messageLen.ToString()); stream.Position = 0; stream.Write(size, 0, size.Length); ClusteredArrayList byteList = stream.GetInternalBuffer(); return(byteList); } }
public static object DeserailizeResponse(object response, string context) { object result = null; if (response is byte[]) { result = CompactBinaryFormatter.FromByteBuffer((byte[])response, context); } else if (response is IList) { IList buffers = response as IList; ClusteredMemoryStream stream = new ClusteredMemoryStream(0); foreach (byte[] buffer in buffers) { stream.Write(buffer, 0, buffer.Length); } stream.Position = 0; result = CompactBinaryFormatter.Deserialize(stream, context); } return(result); }
/// <summary>Removes events from mq and calls handler.down(evt) </summary> override public void Run() { bool connectionCloseNotified = false; try { ArrayList msgList = new ArrayList(); byte[] tmpBuffer = null; int totalMsgSize = 4; int noOfMsgs = 0; int offset = 8; bool resendMessage = false; ArrayList msgsTobeSent = new ArrayList(); ClusteredMemoryStream stream = null; while (!mq.Closed) { try { if (resendMessage) { if (stream != null && stream.Length > 0) { peerConnection.send(stream.GetInternalBuffer(), null, totalMsgSize + 4); } resendMessage = false; continue; } msgsTobeSent.Clear(); stream = new ClusteredMemoryStream(); lock (sync_lock) { tmpBuffer = sendBuffer; totalMsgSize = 4; noOfMsgs = 0; offset = 8; stream.Seek(8, System.IO.SeekOrigin.Begin); BinaryMessage bMsg = (BinaryMessage)mq.remove(); if (bMsg != null) { if (!peerConnection.IsPrimary) { msgsTobeSent.Add(bMsg); } noOfMsgs++; totalMsgSize += bMsg.Size; foreach (byte[] buffer in bMsg.Buffer) { stream.Write(buffer, 0, buffer.Length); } if (bMsg.UserPayLoad != null) { byte[] buf = null; for (int i = 0; i < bMsg.UserPayLoad.Length; i++) { buf = bMsg.UserPayLoad.GetValue(i) as byte[]; stream.Write(buf, 0, buf.Length); offset += buf.Length; } } } bMsg = null; } byte[] bTotalLength = Util.Util.WriteInt32(totalMsgSize); stream.Seek(0, System.IO.SeekOrigin.Begin); stream.Write(bTotalLength, 0, bTotalLength.Length); byte[] bNoOfMsgs = Util.Util.WriteInt32(noOfMsgs); stream.Write(bNoOfMsgs, 0, bNoOfMsgs.Length); peerConnection.send(stream.GetInternalBuffer(), null, totalMsgSize + 4); stream = null; } catch (ExtSocketException e) { connectionCloseNotified = false; NCacheLog.Error(Name, e.ToString()); if (peerConnection.IsPrimary) { if (peerConnection.LeavingGracefully) { NCacheLog.Error("DmSender.Run", peerConnection.peer_addr + " left gracefully"); break; } NCacheLog.Error("DMSender.Run", "Connection broken with " + peerConnection.peer_addr + ". node left abruptly"); Connection connection = peerConnection.Enclosing_Instance.Reconnect(peerConnection.peer_addr, out connectionCloseNotified); if (connection != null) { Thread.Sleep(3000); resendMessage = true; continue; } else { NCacheLog.Error("DMSender.Run", Name + ". Failed to re-establish connection with " + peerConnection.peer_addr); break; } } else { NCacheLog.Error("DmSender.Run", "secondary connection broken; peer_addr : " + peerConnection.peer_addr); try { foreach (BinaryMessage bMsg in msgsTobeSent) { try { if (bMsg != null && mq != null && !mq.Closed) { mq.add(bMsg); } } catch (Exception ex) { NCacheLog.Error("DmSender.Run", "an error occurred while requing the messages. " + ex.ToString()); } } } catch (Exception) { } } break; } catch (QueueClosedException e) { connectionCloseNotified = false; break; } catch (ThreadInterruptedException e) { connectionCloseNotified = false; break; } catch (ThreadAbortException) { break; } catch (System.Exception e) { connectionCloseNotified = false; NCacheLog.Error(Name + "", Name + " exception is " + e.ToString()); } } } catch (ThreadInterruptedException) { } catch (ThreadAbortException) { } catch (Exception ex) { connectionCloseNotified = false; NCacheLog.Error(Name + "", "exception=" + ex.ToString()); } try { if (!connectionCloseNotified) { peerConnection.Enclosing_Instance.notifyConnectionClosed(peerConnection.peer_addr); } else { NCacheLog.CriticalInfo("DmSender.Run", "no need to notify about connection close"); } peerConnection.Enclosing_Instance.remove(peerConnection.peer_addr, peerConnection.IsPrimary); } catch (Exception e) { //who cares... } }