Ejemplo n.º 1
0
        /// <summary>
        /// フレームに分割してエンキューする
        /// </summary>
        /// <param name="op"></param>
        /// <param name="bytes"></param>
        public void SendFrame(WebSocketFrameOpCode op, ArraySegment <Byte> bytes)
        {
            lock (m_lock)
            {
                var headerSize = GetHeaderSize();
                if ((bytes.Count + headerSize) <= m_frameSize)
                {
                    // 分割無し
                    var item   = GetOrCreateBuffer();
                    var buffer = new ByteBuffer(item);
                    WriteHeader(buffer, op, bytes.Count, true);
                    buffer.Push(bytes);
                    m_sender.Enqueue(buffer.Bytes);
                    return;
                }

                int payloadSize = 0;
                {
                    //Logger.LogFormat("first: {0}/{1}", payloadSize, bytes.Count);
                    // 先頭バッファ
                    var item   = GetOrCreateBuffer();
                    var buffer = new ByteBuffer(item);
                    payloadSize = item.Length - headerSize;
                    WriteHeader(buffer, op, payloadSize, false);
                    var splited = Split(bytes, payloadSize);
                    buffer.Push(splited.First);
                    m_sender.Enqueue(buffer.Bytes);
                    bytes = splited.Second;
                }

                while (bytes.Count > 0)
                {
                    var item   = GetOrCreateBuffer();
                    var buffer = new ByteBuffer(item);
                    if (bytes.Count <= payloadSize)
                    {
                        //Logger.LogFormat("fin: {0}", bytes.Count);
                        // last
                        WriteHeader(buffer, WebSocketFrameOpCode.Continuours, bytes.Count, true);
                        buffer.Push(bytes);
                        m_sender.Enqueue(buffer.Bytes);
                        break;
                    }
                    else
                    {
                        //Logger.LogFormat("continue: {0}", payloadSize);
                        // 継続
                        WriteHeader(buffer, WebSocketFrameOpCode.Continuours, payloadSize, false);
                        var splited = Split(bytes, payloadSize);
                        buffer.Push(splited.First);
                        m_sender.Enqueue(buffer.Bytes);
                        bytes = splited.Second;
                    }
                }
            }
        }
Ejemplo n.º 2
0
        public static void WriteHeader(ByteBuffer buffer, WebSocketFrameOpCode op, int payloadSize, bool fin)
        {
            Byte b0 = (Byte)(fin ? 0x80 : 0x00);

            b0 |= (Byte)op;
            buffer.Push(b0);

            if (payloadSize < 126)
            {
                Byte b1 = (Byte)payloadSize;
                buffer.Push(b1);
            }
            else if (payloadSize < UInt16.MaxValue)
            {
                Byte b1 = 126;
                buffer.Push(b1);

                var count = (UInt16)payloadSize;

                // network byte order(big endian)
                buffer.Push((Byte)(count >> 8));
                buffer.Push((Byte)(count & 0xFF));
            }
            else
            {
                Byte b1 = 127;
                buffer.Push(b1);

                var count = (UInt64)payloadSize;

                // network byte order(big endian)
                buffer.Push((Byte)(count >> 56));
                buffer.Push((Byte)(count >> 48));
                buffer.Push((Byte)(count >> 40));
                buffer.Push((Byte)(count >> 32));
                buffer.Push((Byte)(count >> 24));
                buffer.Push((Byte)(count >> 16));
                buffer.Push((Byte)(count >> 8));
                buffer.Push((Byte)(count & 0xFF));
            }
        }
Ejemplo n.º 3
0
        public void SendFrame(WebSocketFrameOpCode op, ArraySegment <byte> bytes)
        {
            var sessions = Sessions;

            foreach (var session in sessions)
            {
                try
                {
                    session.SendFrame(op, bytes);
                }
                catch (ObjectDisposedException)
                {
                    session.Dispose();
                }
                catch (Exception ex)
                {
                    //session.Dispose();
                    Logger.Exception(ex);
                }
            }
        }