private void StartSend() { if (State == TransportState.Connected) { // prepare data to send (if any) byte[] data = null; if (outbox.CanDequeue) { byte[] temp = outbox.BeginDequeue(); if (temp != null) { using (MemoryStream mem = new MemoryStream()) { // session ID if (isFirstSend) { isFirstSend = false; mem.WriteBytes(sessionID); } // payload size mem.WriteShort((short)(temp.Length + PriorityHeaderSize)); // if encrypting, we need another stream if (Core.Network.TransactionalEncryption != null) { byte[] toEncode = null; using (MemoryStream enc = new MemoryStream()) { // priority header (always priority 3 -> highest transactional one) int msgLength = temp.Length; enc.WriteByte((byte)((3 & 0x0F) | (((msgLength) & 0x000F) << 4))); enc.WriteByte((byte)(msgLength >> 4)); // data enc.WriteBytes(temp); // encrypt toEncode = enc.ToArray(); Core.Network.TransactionalEncryption.Encrypt(toEncode, toEncode.Length); } // writing encoded data if (toEncode != null) { mem.WriteBytes(toEncode); } } else { // priority header (always priority 3 -> highest transactional one) int msgLength = temp.Length; mem.WriteByte((byte)((3 & 0x0F) | (((msgLength) & 0x000F) << 4))); mem.WriteByte((byte)(msgLength >> 4)); // data mem.WriteBytes(temp); } data = mem.ToArray(); } } else if (isFirstSend) { // sending just session ID isFirstSend = false; data = (byte[])sessionID.Clone(); } } if (data != null) { socket.Send(endPoint, data); } } }