Ejemplo n.º 1
0
        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);
                }
            }
        }